我有一个包含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
答案 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解决方案,我怀疑它比aggregate
或ddply
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的子集。