在R中汇总数据帧的部分

时间:2015-05-14 15:01:42

标签: r

对于示例数据框:

structure(list(id = 1:10, group.id = structure(c(1L, 1L, 1L, 
2L, 2L, 2L, 3L, 3L, 3L, 1L), .Label = c("a", "b", "c"), class = "factor"), 
    x = c(2.12, 1.23, 2.36, 4.21, 2.36, NA, 2.36, 4.36, 1.23, 
    2.23), y = c(6.56, 2.36, NA, 4.36, 1.23, 8.56, 4.23, 5.36, 
    2.36, 1.23), z = c(4.36, NA, 5.23, 5.36, 1.23, 4.23, 1.23, 
    NA, 3.26, 2.23), group.x = c(NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA), group.y = c(NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA), group.z = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA)), .Names = c("id", "group.id", "x", "y", "z", "group.x", 
"group.y", "group.z"), class = "data.frame", row.names = c(NA, 
-10L))

我希望使用组ID的列x,y和z中的值的平均值填充group.x / y / z。

因此,ID 1,2,3和10中的值的平均值被平均并填充在相应的列“group.x”,“group.y”和group.z“中。随后对组执行此操作b和c,填写行。

理想情况下,我想要一个额外的表格,详细说明这些组以及数值和方法的数量,因此我可以评估这些值的代表性。根据我对R的基本知识,我只想对数据框进行子集化,并对每个部分进行均值和计数,但是必须有更好的方法...任何想法?

2 个答案:

答案 0 :(得分:4)

我们可以使用data.table创建mean值为' x',' y',' z'按" group.id'分组。柱。我们转换了' data.frame'到' data.table'使用setDT(df1)(或者我们可以使用@Ricardo Saporta建议的as.data.table。一个优点是初始数据集保持不变。我更喜欢使用setDT(只是主观))。我们不需要在初始数据集中创建NA列。

library(data.table)
setDT(df1)[, paste('group', c('x', 'y', 'z'), sep=".") := 
    lapply(.SD, mean, na.rm=TRUE), group.id, .SDcols=c('x','y','z')]

假设我们已经有NA列,请确保该类是相同的,即'数字'

setDT(df1)[, 6:8 := lapply(.SD, as.numeric), .SDcols=6:8][, 
   paste('group', c('x', 'y', 'z'), sep=".") := 
   lapply(.SD, mean, na.rm=TRUE), group.id, .SDcols=c('x','y','z')]

答案 1 :(得分:1)

dplyr怎么样?

library(dplyr)
df%>%
  group_by(group.id)%>%
  mutate(group.x=mean(x,na.rm=T),
         group.y=mean(y,na.rm=T),
         group.z=mean(z,na.rm=T))