根据一列的条件得到数据框中两行的平均值

时间:2016-06-29 17:50:04

标签: r dataframe subset apply mean

我有以下示例数据框:

df<-data.frame(A=c(rep(1:4,4)),B=runif(16,min=0,max=16),c=rnorm(16, mean=6,sd=2))

我想通过为A列创建一个新值作为两个现有值的平均值来折叠数据框。例如,创建一个值A1,2.5,4而不是1:4的新数据框。这样,包含23的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

1 个答案:

答案 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)