转换数据框并按组计算平均值
Transforming a data frame and calculate the mean by group
我有这样一个数据框:
ID A V
1 M 4
1 D 6
1 M 10
2 D 3
2 D 7
我想转换成这个:
ID M D V
1 7 6 10
2 5 5
基本上,我想按组计算平均值。我使用了 "aggregate" 和 "plyr" 包但没有成功。
提前谢谢你。
如果我没理解错的话,你要执行的操作其实需要几个步骤:
1: 按 ID
和 A
分组并计算 V
.
的均值
2: 获取步骤 1 的结果并将其从长格式重塑为宽格式,这样原始列 A
中的每个组在结果 data.frame.
3: 分别按 ID
分组并计算 V
.
的均值
4: 将 ID
步骤 2 和 3 的结果合并为一个 data.frame.
这可以通过多次调用 aggregate()
, a call to reshape()
on the first aggregation result, and finally a call to merge()
:
来完成
df <- data.frame(ID=c(1L,1L,1L,2L,2L),A=c('M','D','M','D','D'),V=c(4L,6L,10L,3L,7L),stringsAsFactors=F);
merge(reshape(aggregate(V~ID+A,df,mean),dir='w',idvar='ID',timevar='A'),aggregate(V~ID,df,mean));
## ID V.D V.M V
## 1 1 6 7 6.666667
## 2 2 5 NA 5.000000
(我认为您在输入预期输出时犯了一个错误;组 ID=1
的 V
的平均值是 6.666667,而不是 10。)
我有这样一个数据框:
ID A V
1 M 4
1 D 6
1 M 10
2 D 3
2 D 7
我想转换成这个:
ID M D V
1 7 6 10
2 5 5
基本上,我想按组计算平均值。我使用了 "aggregate" 和 "plyr" 包但没有成功。
提前谢谢你。
如果我没理解错的话,你要执行的操作其实需要几个步骤:
1: 按 ID
和 A
分组并计算 V
.
2: 获取步骤 1 的结果并将其从长格式重塑为宽格式,这样原始列 A
中的每个组在结果 data.frame.
3: 分别按 ID
分组并计算 V
.
4: 将 ID
步骤 2 和 3 的结果合并为一个 data.frame.
这可以通过多次调用 aggregate()
, a call to reshape()
on the first aggregation result, and finally a call to merge()
:
df <- data.frame(ID=c(1L,1L,1L,2L,2L),A=c('M','D','M','D','D'),V=c(4L,6L,10L,3L,7L),stringsAsFactors=F);
merge(reshape(aggregate(V~ID+A,df,mean),dir='w',idvar='ID',timevar='A'),aggregate(V~ID,df,mean));
## ID V.D V.M V
## 1 1 6 7 6.666667
## 2 2 5 NA 5.000000
(我认为您在输入预期输出时犯了一个错误;组 ID=1
的 V
的平均值是 6.666667,而不是 10。)