在data.table中使用Column而不键入其名称的快捷方式

时间:2016-06-16 10:50:28

标签: r data.table

我将虹膜数据集转换为data.table格式。我的目标是取所有列的平均值,并使用data.table将它们按Species分组。

DT <-as.data.table(iris)

以下是我想要的输出

DT[,.(mean(Sepal.Length),mean(Sepal.Width),mean(Petal.Length),mean(Petal.Width)),by =.(Species)]
      Species    V1    V2    V3    V4
1:     setosa 5.006 3.428 1.462 0.246
2: versicolor 5.936 2.770 4.260 1.326
3:  virginica 6.588 2.974 5.552 2.026

但是当我们有大量列时,使用上面的方式键入所有列名称是时间混乱。我使用下面的命令尝试了这个。但输出的排列方式略有不同

DT[, .(vapply(DT[,!'Species',with=FALSE],mean,FUN.VALUE =1)),by = .(Species)]
               Species       V1
         1:     setosa 5.843333
         2:     setosa 3.057333
         3:     setosa 3.758000
         4:     setosa 1.199333
         5: versicolor 5.843333
         6: versicolor 3.057333
         7: versicolor 3.758000
         8: versicolor 1.199333
         9:  virginica 5.843333
        10:  virginica 3.057333
        11:  virginica 3.758000
        12:  virginica 1.199333

有没有办法使用上述类型的东西并摆脱键入所有列名称只是为了取出均值并使用data.table

按物种分组

请不要建议使用&#39; = FALSE&#39; 。我已经知道了。

1 个答案:

答案 0 :(得分:0)

structure(list(Species = structure(1:3, .Label = c("setosa", 
"versicolor", "virginica"), class = "factor"), Sepal.Length = c(5.006, 
5.936, 6.588), Sepal.Width = c(3.428, 2.77, 2.974), Petal.Length = c(1.462, 
4.26, 5.552), Petal.Width = c(0.246, 1.326, 2.026)), row.names = c(NA, 
-3L), class = c("data.table", "data.frame"), .Names = c("Species", 
"Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"), 
.internal.selfref = <pointer: 0x0000000003fd0788>)

期望的输出: -

iris <- iris[,lapply(.SD,mean), by=Species, .SDcols = c("Sepal.Length", "Sepal.Width")]

假设您只想要&#34; Sepal.Length&#34;和&#34; Sepal.Width&#34;列。您可以通过稍作修改来实现,如下所示: -

Read()

在data.table中,DT [i,j,by],j必须返回一个列表并且lapply返回列表