簡體   English   中英

根據一列的條件獲取數據框中兩行的平均值

[英]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 這樣,將刪除包含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

我會寫一個折疊函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM