R 使用组平均值和/或匹配不同长度的数据帧进行计算
我试图在此数据框(df)中添加一列B,其中的值基于a的组平均值(每个不同ID的平均值)。例如,B将是每个T的10*平均值(A)R 使用组平均值和/或匹配不同长度的数据帧进行计算,r,plyr,R,Plyr,我试图在此数据框(df)中添加一列B,其中的值基于a的组平均值(每个不同ID的平均值)。例如,B将是每个T的10*平均值(A) ID T A 1 1 1.1 1 10 1.3 1 100 1.5 2 1 2.6 2 10 1.9 2 100 2.2 一种方法是计算每个组的平均值(ID==1和ID==2),将其存储在一个新对象中,然后使用ID匹配对象 有了plyr,我们可以得到A的组平均值: A.mean <- ddply(df, "ID", su
ID T A
1 1 1.1
1 10 1.3
1 100 1.5
2 1 2.6
2 10 1.9
2 100 2.2
一种方法是计算每个组的平均值(ID==1和ID==2),将其存储在一个新对象中,然后使用ID匹配对象
有了plyr,我们可以得到A的组平均值:
A.mean <- ddply(df, "ID", summarise, mean(A))
然后使用
transform
而不是summary
执行df$B:
ddply(df, .(ID), transform, A.mean = mean(A), B = mean(A) * 10)
# ID T A A.mean B
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或者,您可以在ddply
调用后添加B列,如您的问题所示
请注意,summary
将数据分解为每组1行(在本例中为ID),而transform
保留现有结构,在本例中,只需添加相同长度的新列
下面是等效的dplyr
代码(如果您使用的是大型数据集,则速度会更快):
库(dplyr)
df%
分组依据(ID)%>%
dplyr::突变(A.mean=mean(A),
B=A.平均值*10)
使用转换
而不是摘要
:
ddply(df, .(ID), transform, A.mean = mean(A), B = mean(A) * 10)
# ID T A A.mean B
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或者,您可以在ddply
调用后添加B列,如您的问题所示
请注意,summary
将数据分解为每组1行(在本例中为ID),而transform
保留现有结构,在本例中,只需添加相同长度的新列
下面是等效的dplyr
代码(如果您使用的是大型数据集,则速度会更快):
库(dplyr)
df%
分组依据(ID)%>%
dplyr::突变(A.mean=mean(A),
B=A.平均值*10)
使用转换
而不是摘要
:
ddply(df, .(ID), transform, A.mean = mean(A), B = mean(A) * 10)
# ID T A A.mean B
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或者,您可以在ddply
调用后添加B列,如您的问题所示
请注意,summary
将数据分解为每组1行(在本例中为ID),而transform
保留现有结构,在本例中,只需添加相同长度的新列
下面是等效的dplyr
代码(如果您使用的是大型数据集,则速度会更快):
库(dplyr)
df%
分组依据(ID)%>%
dplyr::突变(A.mean=mean(A),
B=A.平均值*10)
使用转换
而不是摘要
:
ddply(df, .(ID), transform, A.mean = mean(A), B = mean(A) * 10)
# ID T A A.mean B
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或者,您可以在ddply
调用后添加B列,如您的问题所示
请注意,summary
将数据分解为每组1行(在本例中为ID),而transform
保留现有结构,在本例中,只需添加相同长度的新列
下面是等效的dplyr
代码(如果您使用的是大型数据集,则速度会更快):
库(dplyr)
df%
分组依据(ID)%>%
dplyr::突变(A.mean=mean(A),
B=A.平均值*10)
使用ave
within(df, {A.mean=ave(A, ID, FUN=mean); B.mean=10*A.mean})[,c(1:3,5,4)]
# ID T A A.mean B.mean
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或
或使用数据的另一种方式。表
:
setDT(df)[, c("A.mean", "B.mean") := { m = mean(A); list(m, m*10) }, by=ID]
使用ave
within(df, {A.mean=ave(A, ID, FUN=mean); B.mean=10*A.mean})[,c(1:3,5,4)]
# ID T A A.mean B.mean
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或
或使用数据的另一种方式。表
:
setDT(df)[, c("A.mean", "B.mean") := { m = mean(A); list(m, m*10) }, by=ID]
使用ave
within(df, {A.mean=ave(A, ID, FUN=mean); B.mean=10*A.mean})[,c(1:3,5,4)]
# ID T A A.mean B.mean
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或
或使用数据的另一种方式。表
:
setDT(df)[, c("A.mean", "B.mean") := { m = mean(A); list(m, m*10) }, by=ID]
使用ave
within(df, {A.mean=ave(A, ID, FUN=mean); B.mean=10*A.mean})[,c(1:3,5,4)]
# ID T A A.mean B.mean
#1 1 1 1.1 1.300000 13.00000
#2 1 10 1.3 1.300000 13.00000
#3 1 100 1.5 1.300000 13.00000
#4 2 1 2.6 2.233333 22.33333
#5 2 10 1.9 2.233333 22.33333
#6 2 100 2.2 2.233333 22.33333
或
或使用数据的另一种方式。表
:
setDT(df)[, c("A.mean", "B.mean") := { m = mean(A); list(m, m*10) }, by=ID]
@Arun,我正在搜索此解决方案,但无法获得正确的语法。谢谢,阿克伦,没关系。我已经感谢你的努力了。您的解决方案一点也不坏。@Arun,我正在搜索此解决方案,但无法获得正确的语法。谢谢,阿克伦,没关系。我已经感谢你的努力了。您的解决方案一点也不坏。@Arun,我正在搜索此解决方案,但无法获得正确的语法。谢谢,阿克伦,没关系。我已经感谢你的努力了。您的解决方案一点也不坏。@Arun,我正在搜索此解决方案,但无法获得正确的语法。谢谢,阿克伦,没关系。我已经感谢你的努力了。你的答案一点也不坏,也是一个很好的答案!谢谢这也是一个很好的答案!谢谢这也是一个很好的答案!谢谢这也是一个很好的答案!谢谢