对于示例数据框:
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的基本知识,我只想对数据框进行子集化,并对每个部分进行均值和计数,但是必须有更好的方法...任何想法?
答案 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))