假设我有一个如下数据框:
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)。我怎样才能重写这个,以便我可以将它一般地应用于每列的平均重复行名称,无论有多少列?
答案 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