Группировать по всем столбцам в таблице data.table - PullRequest
3 голосов
/ 29 мая 2020

Я работаю с iris таблицей данных в R.

Чтобы напомнить, как это выглядит, я вставляю сюда шесть пяти строк

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:          5.1         3.5          1.4         0.2  setosa
2:          4.9         3.0          1.4         0.2  setosa
3:          4.7         3.2          1.3         0.2  setosa
4:          4.6         3.1          1.5         0.2  setosa
5:          5.0         3.6          1.4         0.2  setosa
6:          5.4         3.9          1.7         0.4  setosa

Я хотел бы вычислить число строк, сгруппированных по всем столбцам. Конечно, мы можем записать все переменные в by, например:

iris[, .(Freq = .N), by = .(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species)]



   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Freq
1:          5.1         3.5          1.4         0.2  setosa    1
2:          4.9         3.0          1.4         0.2  setosa    1
3:          4.7         3.2          1.3         0.2  setosa    1
4:          4.6         3.1          1.5         0.2  setosa    1
5:          5.0         3.6          1.4         0.2  setosa    1
6:          5.4         3.9          1.7         0.4  setosa    1

Однако мне интересно, есть ли метод группировки по всем переменным без необходимости вводить все имена столбцов?

Ответы [ 3 ]

3 голосов
/ 31 мая 2020

В случае, если вы ищете дубликаты, uniqueN по умолчанию будет использовать все столбцы:

uniqueN(as.data.table(iris))
# [1] 149

Это не дает прямого ответа на ваш вопрос, но может быть более прямым способом выполнить то, что вы пытались сделать это в первую очередь.

Точно так же, если вы ищете, какие строки дублируются, вы можете использовать метод duplicated * data.table, который аналогично по умолчанию использует все столбцы:

iris[duplicated(iris)]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1:          5.8         2.7          5.1         1.9 virginica
1 голос
/ 29 мая 2020

Мы можем использовать

library(data.table)
out1 <- as.data.table(iris)[, .N, by = names(iris)]

-проверка с подходом OP

out2 <-  as.data.table(iris)[,  .N, by = .(Sepal.Length, 
      Sepal.Width, Petal.Length, Petal.Width, Species)]
identical(out1, out2)
#[1] TRUE
1 голос
/ 29 мая 2020

Вот подход в Base-R

Freq <- table(apply(iris,1,paste0, collapse=" "))
iris$Freq <- apply(iris,1, function(x) Freq[names(Freq) %in% paste0(x,collapse=" ")])

вывод:

> iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species Freq
...          ...         ...          ...         ...  ...        ...
140          6.9         3.1          5.4         2.1  virginica    1
141          6.7         3.1          5.6         2.4  virginica    1
142          6.9         3.1          5.1         2.3  virginica    1
143          5.8         2.7          5.1         1.9  virginica    2
144          6.8         3.2          5.9         2.3  virginica    1
145          6.7         3.3          5.7         2.5  virginica    1
...