[英]Getting the mean of two rows in data frame based on the condition of one column
我有以下示例數據框:
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
我會寫一個折疊函數:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.