在data.table中按所有列进行分组

4
我正在使用R中的iris数据表进行工作。
为了提醒您它的外观,我在这里粘贴了六五行。
   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

但是,我想知道是否有一种方法可以按照所有变量分组,而不需要输入所有列名?


4
请查看帮助文本 ?data.table:"by 可以接受...一个由列名组成的字符向量"。因此,iris[, .N, by = names(iris)] - Henrik
3个回答

3

如果您正在寻找重复项,则uniqueN将默认使用所有列:

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

这并不是直接回答你的问题,但这可能是实现你最初尝试的更直接的方法。
同样地,如果你正在寻找重复的行,你可以使用 duplicateddata.table 方法,该方法类似地默认使用所有列:
iris[duplicated(iris)]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1:          5.8         2.7          5.1         1.9 virginica

2
我们可以使用
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
这是一种基于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接