我有以下示例数据框:
df<-data.frame(A=c(rep(1:4,4)),B=runif(16,min=0,max=16),c=rnorm(16, mean=6,sd=2))
我想通过为A列创建一个新值作为两个现有值的平均值来折叠数据框。例如,创建一个值A
为1,2.5,4
而不是1:4
的新数据框。这样,包含2
和3
的df行将被删除,新的df将仅包含12
行,而不是16
。
修改
期望的输出是这样的。
A B c
1 1 8.248871 4.402726
2 2.5 11.694196 4.2878085
4 4 8.036312 2.014886
5 1 9.828333 3.240945
6 2.5 1.151633 2.918831
8 4 12.176981 4.874183
9 1 14.067821 5.480923
10 2.5 6.145208 6.139448
12 4 6.352356 2.586025
13 1 3.423057 5.114978
14 2.5 11.005555 3.265489
16 4 14.579750 3.783269
答案 0 :(得分:2)
我会写一个崩溃函数:
collapse_df <- function(mydf, column, omit, pair, FUN) {
ind <- which(mydf[,column] %in% pair[1])
ind2 <- mydf[,column] %in% pair[-1]
m <- mapply(function(x,y) lapply(mydf[x:y,!names(mydf) %in% omit], FUN), ind, ind+1L)
mydf[ind,] <- cbind.data.frame(mydf[ind,omit], t(m))
mydf[!ind2,]
}
collapse_df(df, "A", pair=2:3, FUN=mean)
# A B c
# 1 1.0 1.060170 4.797753
# 2 2.5 9.577249 6.635214
# 4 4.0 5.612720 3.413631
# 5 1.0 1.734932 10.487560
# 6 2.5 9.577249 6.635214
# 8 4.0 6.529387 5.760596
# 9 1.0 2.517647 5.469165
# 10 2.5 9.577249 6.635214
# 12 4.0 4.243273 6.493916
# 13 1.0 10.118011 4.431953
# 14 2.5 9.577249 6.635214
# 16 4.0 1.563981 5.047428
我们还可以总结其他函数,如中位数或总和:
collapse_df(df, column="A", pair=2:3, FUN=median)
collapse_df(df, "A", 2:3, sum)
collapse_df(iris[-5], column=1, seq(5,6,.1), median)