使用data.table计算所有数字列的摘要统计量(例如均值)

恩索

我有这样的数据numeric和非numeric列:

mydt
          vnum1 vint1 vfac1 vch1
 1: -0.30159484     8     3    E
 2: -0.09833430     8     1    D
 3: -2.15963282     1     3    D
 4:  0.03904374     5     2    B
 5:  1.54928970     4     1    C
 6: -0.73873654     5     1    A
 7: -0.68594479     9     2    B
 8:  1.35765612     1     2    E
 9:  1.46958351     2     1    B
10: -0.89623979     2     4    E

如何仅选择numeric列并计算其mean使用量data.table

我已经试过了:

mydt[ , lapply(.SD, mean), ]
#        vnum1 vint1 vfac1 vch1
# 1: -0.046491   4.5    NA   NA
# Warning messages:
# 1: In mean.default(X[[3L]], ...) :
#  argument is not numeric or logical: returning NA
# 2: In mean.default(X[[4L]], ...) :
#  argument is not numeric or logical: returning NA


dput(mydt)
structure(list(vnum1 = c(-0.301594844692861, -0.0983343040483769, 
-2.15963282153076, 0.03904374068617, 1.54928969700272, -0.738736535236348, 
-0.685944791146016, 1.35765612481877, 1.46958350568506, -0.896239790653183
), vint1 = c(8L, 8L, 1L, 5L, 4L, 5L, 9L, 1L, 2L, 2L), vfac1 = structure(c(3L, 
1L, 3L, 2L, 1L, 1L, 2L, 2L, 1L, 4L), .Label = c("1", "2", "3", 
"4"), class = "factor"), vch1 = structure(c(5L, 4L, 4L, 2L, 3L, 
1L, 2L, 5L, 2L, 5L), .Label = c("A", "B", "C", "D", "E"), class = "factor")), .Names = c("vnum1", 
"vint1", "vfac1", "vch1"), class = c("data.table", "data.frame"
), row.names = c(NA, -10L), .internal.selfref = <pointer: 0x991c070>)

我也尝试了以下方法,但是不起作用:

 mydt[ , lapply(.SD, is.numeric),]
 #    vnum1 vint1 vfac1  vch1
 # 1:  TRUE  TRUE FALSE FALSE

mydt[,mydt[,lapply(.SD, is.numeric),]]
#    vnum1 vint1 vfac1  vch1
# 1:  TRUE  TRUE FALSE FALSE

mydt[ , mydt[ , lapply(.SD, is.numeric) , ], with = F]
# Error in Math.data.frame(j) : 
#  non-numeric variable in data frame: vnum1vint1vfac1vch1

mydt[ , c(mydt[ , lapply(.SD, is.numeric)), ], with = F]
# Error: unexpected ')' in "mydt[,c(mydt[,lapply(.SD, is.numeric))"

正如@Arun所建议的那样,我尝试了以下操作,但无法获得子集:

 xx <- mydt[ , lapply(.SD, is.numeric), ]
 xx
 #    vnum1 vint1 vfac1  vch1
 # 1:  TRUE  TRUE FALSE FALSE

 mydt[ , lapply(.SD, mean), .SDcols = xx]
 # Error in `[.data.table`(mydt, , lapply(.SD, mean), .SDcols = xx) : 
 # .SDcols should be column numbers or names

正如@David所建议的那样,我尝试了以下操作,但获取NULL了非数字列的值。我想获取mydt的子集,以便甚至不列出其他列。

mydt[ , lapply(.SD, function(x) if(is.numeric(x)) mean(x))]
#       vnum1 vint1 vfac1 vch1
# 1: -0.046491   4.5  NULL NULL

我缺少data.frame:

sapply(mydf, is.numeric)
# vnum1 vint1 vfac1  vch1 
#  TRUE  TRUE FALSE FALSE 

mydf[sapply(mydf, is.numeric)]
#         vnum1 vint1
#1  -0.30159484     8
#2  -0.09833430     8
#3  -2.15963282     1
#4   0.03904374     5
#5   1.54928970     4
#6  -0.73873654     5
#7  -0.68594479     9
#8   1.35765612     1
#9   1.46958351     2
#10 -0.89623979     2


sapply(mydf[sapply(mydf, is.numeric)], mean)
#    vnum1     vint1 
#-0.046491  4.500000 

好的。感谢David的评论,以下作品:

mydt[, sapply(mydt, is.numeric), with = FALSE][,sapply(.SD, mean),]
#    vnum1     vint1 
# -0.046491  4.500000 

mydt[, sapply(mydt, is.numeric), with = FALSE]
#          vnum1 vint1
# 1: -0.30159484     8
# 2: -0.09833430     8
# 3: -2.15963282     1
# 4:  0.03904374     5
# ...
阿伦

通过在SO上搜索.SDcols,我找到了这个答案,我认为它很好地解释了如何使用它。

cols = sapply(mydt, is.numeric)
cols = names(cols)[cols]
mydt[, lapply(.SD, mean), .SDcols = cols]
#        vnum1 vint1
# 1: -0.046491   4.5

这样做mydt[, sapply(mydt, is.numeric), with = FALSE](注意:做到这一点的“现代”方法mydt[ , .SD, .SDcols = is.numeric])效率不高,因为它使用这些列将data.table子集化,并产生了(深层)副本-不必要地使用了更多内存。

并使用colMeans将data.table强制转换为matrix,这又不是那么高效的内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算所有数字列的加权平均值

来自分类Dev

R:强制使用data.table计算所有互动

来自分类Dev

使用函数计算并显示从1到用户在python中输入的数字的所有数字的平均值

来自分类Dev

使用 dplyr 和 RcppRoll 计算所有固定窗口平均值

来自分类Dev

R Data.table,用于计算多个列中的摘要统计信息

来自分类Dev

计算所有div元素,并使用jQuery在span内添加每个数字

来自分类Dev

根据摘要统计信息过滤出data.table列

来自分类Dev

计算所有数字的除数数,直到 N

来自分类Dev

使用bash取一行中所有数字和文件中所有行的平均值

来自分类Dev

使用pyspark计算所有可能的单词对

来自分类Dev

计算所有PID的CPU使用率

来自分类Dev

不使用fnGetNodes()计算所有行

来自分类Dev

如何使用jQuery计算所有行的总和?

来自分类Dev

我可以使用setkey()获取data.table中数字列的所有行吗?

来自分类Dev

计算data.frame的摘要统计信息

来自分类Dev

使用 ddply() 在数据框中的所有数字列上执行多个函数(均值、标准差等)

来自分类Dev

使用`scipy.stats`计算t统计量

来自分类Dev

使用R的条件计算条件data.table中不同列的均值

来自分类Dev

使用R的条件计算条件data.table中不同列的均值

来自分类Dev

使用data.table时如何提取所有列?

来自分类Dev

使用data.table时如何提取所有列?

来自分类Dev

为python列表中的所有数字计算所有产品

来自分类Dev

R使用data.table对多个列进行多重统计

来自分类Dev

使用lapply存储在列表中的简单线性回归的摘要统计量

来自分类Dev

使用java计算所有生成有效命令的子字符串

来自分类Dev

使用mongo计算所有文档中的数组出现次数

来自分类Dev

如何使用C#计算所有已定义的子窗体

来自分类Dev

使用索引时,范围是否必须计算所有先前的值

来自分类Dev

使用colums值作为参数计算所有字符串的出现次数-MySQL

Related 相关文章

  1. 1

    计算所有数字列的加权平均值

  2. 2

    R:强制使用data.table计算所有互动

  3. 3

    使用函数计算并显示从1到用户在python中输入的数字的所有数字的平均值

  4. 4

    使用 dplyr 和 RcppRoll 计算所有固定窗口平均值

  5. 5

    R Data.table,用于计算多个列中的摘要统计信息

  6. 6

    计算所有div元素,并使用jQuery在span内添加每个数字

  7. 7

    根据摘要统计信息过滤出data.table列

  8. 8

    计算所有数字的除数数,直到 N

  9. 9

    使用bash取一行中所有数字和文件中所有行的平均值

  10. 10

    使用pyspark计算所有可能的单词对

  11. 11

    计算所有PID的CPU使用率

  12. 12

    不使用fnGetNodes()计算所有行

  13. 13

    如何使用jQuery计算所有行的总和?

  14. 14

    我可以使用setkey()获取data.table中数字列的所有行吗?

  15. 15

    计算data.frame的摘要统计信息

  16. 16

    使用 ddply() 在数据框中的所有数字列上执行多个函数(均值、标准差等)

  17. 17

    使用`scipy.stats`计算t统计量

  18. 18

    使用R的条件计算条件data.table中不同列的均值

  19. 19

    使用R的条件计算条件data.table中不同列的均值

  20. 20

    使用data.table时如何提取所有列?

  21. 21

    使用data.table时如何提取所有列?

  22. 22

    为python列表中的所有数字计算所有产品

  23. 23

    R使用data.table对多个列进行多重统计

  24. 24

    使用lapply存储在列表中的简单线性回归的摘要统计量

  25. 25

    使用java计算所有生成有效命令的子字符串

  26. 26

    使用mongo计算所有文档中的数组出现次数

  27. 27

    如何使用C#计算所有已定义的子窗体

  28. 28

    使用索引时,范围是否必须计算所有先前的值

  29. 29

    使用colums值作为参数计算所有字符串的出现次数-MySQL

热门标签

归档