【问题标题】:Aggregate by group and get count, mean and sd of non-NA values for different data.frame columns按组聚合并获取不同 data.frame 列的非 NA 值的计数、平均值和标准差
【发布时间】:2018-01-18 14:53:18
【问题描述】:

我在通过以下函数按组计算非缺失值时遇到了一些困难(它也给出了标准差和平均值):

test <- do.call(data.frame, aggregate(. ~ treatment, have, function(x) c(n = sum(!is.na(x)), mean = mean(x), sd = sd(x))))

它最终为我提供了数据框中所有列的非缺失数量,而不仅仅是单个列。

我一直在通过 SO 寻找一些建议,发现 thisthisthis 很有帮助,但我不明白为什么带有 function(x) 的聚合会结合一些列sum(!is.na(x),但不是平均值或标准差。

编辑:添加表格

This is the data I have

This is the data I get from my code

This is the table I want

您会注意到,在“有”数据框中,按治疗组计算 var1 列中的非缺失行得出以下结果:

车 - 9 gr.4 - 8 gr.3 - 10 gr.2 - 5

但是当使用 sum(!is.na(x) 我得到以下结果

车辆 - 6 gr.4 - 5 gr.3 - 10 gr.2 - 5

我相信这是因为该函数同时使用 var1 和 var2 来求和非缺失的数量。我不知道如何纠正这个问题。

最好的,

杰克

【问题讨论】:

  • 如果您提供带有示例输入和所需输出的reproducible example,则更容易为您提供帮助。

标签: r aggregate missing-data


【解决方案1】:

这是data.table 方法:

数据

您拥有的数据读入 R 很麻烦 - 请使用 dput() 等以方便其他人使用:

> dput(dt)
structure(list(someting = c("503", "553", "599", "647", "695", 
"728", "760", "793", "826", "859", "907", "955", "1003", "1036", 
"1084", "1131", "1179", "1226", "1274", "1322", "1355", "1402", 
"1450", "1497", "1545"), treatment = c("gr.2", "gr.2", "gr.2", 
"gr.2", "gr.2", "gr.2", "gr.2", "gr.2", "gr.2", "gr.2", "gr.2", 
"gr.3", "gr.3", "gr.3", "gr.3", "gr.3", "gr.3", "gr.3", "gr.3", 
"gr.3", "gr.3", "gr.3", "gr.3", "gr.4", "gr.4"), var1 = c(8, 
NA, 3, 3, NA, NA, NA, NA, NA, 8, 8, 8, NA, 8, 8, 8, 8, 8, 8, 
NA, 8, 8, 8, 8, NA), var2 = c(8L, 8L, 8L, 8L, NA, NA, NA, NA, 
NA, 8L, 8L, 8L, NA, 8L, 8L, 8L, 8L, 8L, 8L, NA, 8L, 8L, 8L, 8L, 
NA)), .Names = c("someting", "treatment", "var1", "var2"), row.names = c(NA, 
-25L), class = c("data.table", "data.frame"))

代码

dt[, .(var1.n = sum(!is.na(var1)),
       var2.n = sum(!is.na(var1)), 
       var1.mean = mean(var1, na.rm = T), 
       var2.mean = mean(var2, na.rm = T)), 
   by = .(treatment)]

输出

      treatment var1.n var2.n var1.mean var2.mean
1:      gr.2      5      5         6         8
2:      gr.3     10     10         8         8
3:      gr.4      1      1         8         8

由于某种原因,“veh”条目没有被读入。因此输出略有不同,但原理应该很清楚。

【讨论】:

  • 我放的数据只是一个例子,我的实际数据有大约40个变量。这就是我尝试使用聚合和函数(x)的原因。您的代码将要求我为 n、mean 和 sd 创建单独的代码行,这太麻烦了。对于繁琐的数据,我深表歉意——下次将使用 dput。
  • @Jbimble 您可以参考此处发布的答案stackoverflow.com/questions/11680579/… 进行多列分配。可以使用 colnames(dt) 上的 lapply 创建具有新列名的向量,并且可以从函数调用或答案中指定的任何其他方法获得值。
猜你喜欢
  • 2013-05-22
  • 2013-04-28
  • 2021-03-22
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多