У меня есть это:
df<-structure(list(x = c(-0.803739264931451, 0.852850728148773, 0.927179506105653, -0.752626056626365, 0.706846224294882, 1.0346985222527, -0.475845197699957, -0.460301566967151, -0.680301544955355, -1.03196929988978), y = c(-0.853052609097935, 0.367618436999606, -0.274902437566225, -0.511565170496435, 0.81067919693492, 0.394655023166806, 0.989760805249143, -0.858997792847955, -0.66149481321353, -0.0219935446644728), shape = c(1, 1, 2, 2, 2, 2, 3, 3, 4, 4)), row.names = c(NA, 10L), class = "data.frame")
Выход:
| Икс | у | форма |
|---|---|---|
| -0,8037393 | -0,85305261 | 1 |
| 0,8528507 | 0,36761844 | 1 |
| 0,9271795 | -0,27490244 | 2 |
| -0,7526261 | -0,51156517 | 2 |
| 0,7068462 | 0,81067920 | 2 |
| 1.0346985 | 0,39465502 | 2 |
| -0,4758452 | 0,98976081 | 3 |
| -0,4603016 | -0,85899779 | 3 |
| -0,6803015 | -0,66149481 | 4 |
| -1.0319693 | -0,02199354 | 4 |
Ожидаемый результат: Как создать общую строку букв и цифр для «n» кластеров в R для добавления в фрейм данных, как показано ниже:
obs: например, если кластеров 100, метка кластера 100 может быть AA1 и так далее.
df$label<- #What is the correct code for this problem?
| Икс | у | форма | метка |
|---|---|---|---|
| -0,8037393 | -0,85305261 | 1 | А1 |
| 0,8528507 | 0,36761844 | 1 | А2 |
| 0,9271795 | -0,27490244 | 2 | Б1 |
| -0,7526261 | -0,51156517 | 2 | Би 2 |
| 0,7068462 | 0,81067920 | 2 | Б3 |
| 1.0346985 | 0,39465502 | 2 | В4 |
| -0,4758452 | 0,98976081 | 3 | С1 |
| -0,4603016 | -0,85899779 | 3 | С2 |
| -0,6803015 | -0,66149481 | 4 | Д1 |
| -1.0319693 | -0,02199354 | 4 | Д2 |
@langtang, да. Значение формы как-то связано с буквами.





Вот небольшая функция, которая должна сделать это за вас:
f <- function(g,n) {
letter_index = if_else(g%%26 ==0, 26, g%%26)
paste0(
paste0(rep(LETTERS[letter_index], times = ceiling(g/26)), collapse = ""),
1:n)
}
Теперь примените эту функцию к каждому значению формы, используя group_by() и mutate().
df %>%
group_by(shape) %>%
mutate(code = f(cur_group_id(), n()))
Выход:
x y shape code
<dbl> <dbl> <dbl> <chr>
1 -0.804 -0.853 1 A1
2 0.853 0.368 1 A2
3 0.927 -0.275 2 B1
4 -0.753 -0.512 2 B2
5 0.707 0.811 2 B3
6 1.03 0.395 2 B4
7 -0.476 0.990 3 C1
8 -0.460 -0.859 3 C2
9 -0.680 -0.661 4 D1
10 -1.03 -0.0220 4 D2
Объяснение:
f() принимает два значения: целое число, указывающее номер группы (передается cur_groupid()) и количество значений в этом значении shape (передается n()). В функции мы используем по модулю, чтобы получить нужное количество раз для репликации значения БУКВ, а затем вставляем его в последовательность от 1 до n.Кажется, это не работает за пределами 26 различных форм, попробуйте f(28, 3)
Извините, @r2evans, сначала я забыл модуль... вы видите обновление моего решения?
теперь это должно работать .. спасибо, что заметили мою ошибку
Ницца! Позорит мой слишком сложный хак.
Я все еще не совсем понял это правильно.. Теперь я думаю, что все же понял!
df |> group_by(shape) |> mutate(paste0(LETTERS[shape],cumsum(shape)/shape)) вроде тоже работает
так что значение формы как-то связано с буквами? т.е. форма 1 равна A, форма 2 равна B и т.д.?