根据两列条件找到平均值

时间:2015-07-11 14:14:59

标签: r lapply

foo = data.frame(V1=c(rep("A",4),"B",rep("C",3),"D","D"), 
                 V2=c(rep("1",3), rep("2",2),
                      "1", rep("3",2), rep("2",2)), 
                 V3=c(1.2,1.4,1.3,1.5,1.6,1.2,1.1,1,1.3,1.4),
                 V4=c(2.2,2.4,2.3,2.5,2.6,2.2,2.1,2,2.3,2.4),
                 V5=c(3.2,3.4,1.3,3.5,1.6,3.2,1.1,1,3.3,3.4))

结果将保持V1和amp;的独特组合。 V2和每列V3-V5的平均值。示例平均值(1.2,1.4,1.3)= 1.3

 foo
    V1 V2  V3 V4  V5
1   A  1  1.3 2.2 3.2
2   A  2  1.5 2.5 3.5
3   B  2  1.6 2.6 1.6
4   C  1  1.2 2.2 3.2
5   C  3  1.1 2.1 1.1
6   D  2  1.3 2.3 3.3

2 个答案:

答案 0 :(得分:5)

您可以使用其中一个聚合函数。

library(dplyr)
foo %>%
    group_by(V1, V2) %>% 
    summarise_each(funs(mean))

或者

 library(data.table)#v1.9.4+
 setDT(foo)[,lapply(.SD, mean) , by =.(V1, V2)]

或者

 library(sqldf)
 nm1 <- toString(sprintf("avg(%s) as %s", 
             names(foo)[3:ncol(foo)], names(foo)[3:ncol(foo)]))
 fn$sqldf('select V1, V2, $nm1
            from foo
            group by V1, V2')

或使用base R

 aggregate(.~V1+V2, foo, mean)

答案 1 :(得分:2)

或使用plyr

library(plyr)
ddply(foo, .(V1,V2), colwise(mean))

使用doBy

library(doBy)
summaryBy(.~V1+V2 , foo, Fun = mean)