什么是使用ddply / plyr对数据框中每列的重复行的平均值进行平均的一般方法?

时间:2014-09-10 23:30:11

标签: r plyr

假设我有一个如下数据框:

Name   A1   A2   A3   B1   B2   B3   C1   C2   C3
100     3    6    2    9    2    2    1    5    1
200     5    3    7    3    2    6    3    8    3
200     5    5    9    5    0    4    5    4    1
300     4    8    2    7    0    2    1    4    9

名为200的项目是重复的。我想对这两个200行的每列的值进行平均,因此我只在行中表示唯一的项目:

Name   A1   A2   A3   B1   B2   B3   C1   C2   C3
100     3    6    2    9    2    2    1    5    1
200     5    4    8    4    1    5    4    6    2
300     4    8    2    7    0    2    1    4    9

我的新手R编码技巧让我使用以下内容:

removed.duplicates<-ddply(df,"Name",summarize,A1=mean(A1),A2=mean(A2),A3=mean(A3),B1=mean(B1),B2=mean(B2),B3=mean(B3),C1=mean(C1),C2=mean(C2),C3=mean(C3))

这很好用,但是我有更多相似的表,但可能会丢弃需要处理的样本(例如,没有A2,B3)。我怎样才能重写这个,以便我可以将它一般地应用于每列的平均重复行名称,无论有多少列?

3 个答案:

答案 0 :(得分:2)

这应该这样做。我把你的例子放在一个名为df的data.frame中。

 library(dplyr)
 df %>% group_by(Name) %>% summarise_each(funs(mean)) 

答案 1 :(得分:2)

在理解%如何在R中工作的相当模糊的搜索中,我遇到了基本函数aggregate(),它非常简单。

removed.duplicates<-aggregate(df,by=list(Name),FUN=mean)

这给了我想要的结果,虽然有一个额外的专栏:

Group.1   Name   A1   A2   A3   B1   B2   B3   C1   C2   C3
100        100    3    6    2    9    2    2    1    5    1
200        200    5    4    8    4    1    5    4    6    2
300        300    4    8    2    7    0    2    1    4    9

但是很容易摆脱那一栏。

答案 2 :(得分:1)

在更复杂的数据上使用基数R:

> ddf
  Name A1 A2 A3 B1 B2 B3 C1 C2 C3
1  100  3  6  2  9  2  2  1  5  1
2  200  5  3  7  3  2  6  3  8  3
3  200  5  5  9  5  0  4  5  4  1
4  300  4  8  2  7  0  2  1  4  9
5  300  2  4  2  9  6  6  5  8  1
6  300  3  6  2  5  8  8  6  6  5
7  500  4  8  2  7  0  2  1  4  9
> 
> ddf = structure(list(Name = c(100L, 200L, 200L, 300L, 300L, 300L, 500L
+ ), A1 = c(3L, 5L, 5L, 4L, 2L, 3L, 4L), A2 = c(6L, 3L, 5L, 8L, 
+ 4L, 6L, 8L), A3 = c(2L, 7L, 9L, 2L, 2L, 2L, 2L), B1 = c(9L, 3L, 
+ 5L, 7L, 9L, 5L, 7L), B2 = c(2L, 2L, 0L, 0L, 6L, 8L, 0L), B3 = c(2L, 
+ 6L, 4L, 2L, 6L, 8L, 2L), C1 = c(1L, 3L, 5L, 1L, 5L, 6L, 1L), 
+     C2 = c(5L, 8L, 4L, 4L, 8L, 6L, 4L), C3 = c(1L, 3L, 1L, 9L, 
+     1L, 5L, 9L)), .Names = c("Name", "A1", "A2", "A3", "B1", 
+ "B2", "B3", "C1", "C2", "C3"), class = "data.frame", row.names = c(NA, 
+ -7L))
> 
> dups = ddf[duplicated(ddf$Name),]$Name
> ddf2 = ddf[!ddf$Name %in% dups,]
> for(nn in unique(dups))  ddf2 = rbind(ddf2, colMeans(ddf[ddf$Name==nn,]))
> ddf2
  Name A1 A2 A3 B1       B2       B3 C1 C2 C3
1  100  3  6  2  9 2.000000 2.000000  1  5  1
7  500  4  8  2  7 0.000000 2.000000  1  4  9
3  200  5  4  8  4 1.000000 5.000000  4  6  2
4  300  3  6  2  7 4.666667 5.333333  4  6  5
相关问题