在R中,如何在不重命名每列的情况下对组中的数据行进行平均?

时间:2014-10-26 06:55:22

标签: r

我有一个包含68列变量的数据框。

> dim(full_data)
[1] 10299    68

Example:
    F1 F2 M1 M2 M3 ... M66
    1  A  3  5  8      1
    1  B  4  1  2      5
    1  A  9  8  7      7

我需要通过在F1和F2上分组来平均所有列M1到M66。

大多数方法似乎是这样的:     ddply(full_data,C( “F1”, “F2”),概括地说,平均=平均(M1)) - 新行:指定并创建MEAN。我不想为66列做到这一点。我希望列名保持不变。

Example Result:
    F1 F2 M1  M2   M3 ... M66
    1  A  6  6.5  7.5      4
    1  B  4    1    2      5

3 个答案:

答案 0 :(得分:4)

假设您的数据集名为df

## install.packages("data.table")
library(data.table)
setDT(df)[, lapply(.SD, mean), by = list(F1, F2)]
##    F1 F2 M1  M2  M3 M66
## 1:  1  A  6 6.5 7.5   4
## 2:  1  B  4 1.0 2.0   5

如果您的数据集中还有其他一些列,并且您只想包含M1:M66,那么您也可以使用.SDcols

setDT(df)[, lapply(.SD, mean), .SDcols = paste0("M", seq_len(66)), by = list(F1, F2)]

或者您也可以使用dplyr

library(dplyr)
df %>%
  group_by(F1, F2) %>%
  summarise_each(funs(mean))
## Source: local data frame [2 x 6]
## Groups: F1
##     F1 F2 M1  M2  M3 M66
##  1:  1  A  6 6.5 7.5   4
##  2:  1  B  4 1.0 2.0   5

这是一个基本R解决方案,我怀疑它比aggregateddply

更有效率
t(vapply(split(df[, -c(1:2)], df[, 1:2], drop = TRUE), colMeans, double(4))) # In your case it will be double(66)
##     M1  M2  M3 M66
## 1.A  6 6.5 7.5   4
## 1.B  4 1.0 2.0   5

答案 1 :(得分:1)

或使用base R

 aggregate(.~F1+F2, df, mean)
 #   F1 F2 M1  M2  M3 M66
 #1  1  A  6 6.5 7.5   4
 #2  1  B  4 1.0 2.0   5

使用ddply,您可以执行colwise

 library(plyr)
 ddply(df, .(F1, F2), numcolwise(mean))
 #  F1 F2 M1  M2  M3 M66
 #1  1  A  6 6.5 7.5   4
 #2  1  B  4 1.0 2.0   5

数据

df <- structure(list(F1 = c(1L, 1L, 1L), F2 = c("A", "B", "A"), M1 = c(3L, 
4L, 9L), M2 = c(5L, 1L, 8L), M3 = c(8L, 2L, 7L), M66 = c(1L, 
5L, 7L)), .Names = c("F1", "F2", "M1", "M2", "M3", "M66"), class = "data.frame", row.names = c(NA, 
-3L))

答案 2 :(得分:0)

使用基本功能,你可以

mydf <- data.frame(F1 = sample(c("a", "b", "c"), 100, replace = TRUE), 
                   F2 = sample(c("1", "2"), 100, replace = TRUE),
                   M1 = runif(100),
                   M2 = runif(100),
                   M3 = runif(100))

aggregate(. ~ F1 + F2, FUN = mean, data = mydf)

  F1 F2        M1        M2        M3
1  a  1 0.5787761 0.5044229 0.4641159
2  b  1 0.5427231 0.4923563 0.5289595
3  c  1 0.5145906 0.5709069 0.4812297
4  a  2 0.4161674 0.4815931 0.5127524
5  b  2 0.5018423 0.4337168 0.5563098
6  c  2 0.4326560 0.4749937 0.4575443

这将使用所有非F1和F2列进行平均。您可以构造一个公式以仅包含特定的M *列,或者您可以使用例如grepl来执行data.frame的子集。