Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用组平均值和/或匹配不同长度的数据帧进行计算_R_Plyr - Fatal编程技术网

R 使用组平均值和/或匹配不同长度的数据帧进行计算

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

我试图在此数据框(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", 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,我正在搜索此解决方案,但无法获得正确的语法。谢谢,阿克伦,没关系。我已经感谢你的努力了。你的答案一点也不坏,也是一个很好的答案!谢谢这也是一个很好的答案!谢谢这也是一个很好的答案!谢谢这也是一个很好的答案!谢谢