[英]mutate_each in dplyr: create new column with the mean row values of other columns with some text in common
有沒有一種方法可以插入以特定文本開頭的其他現有列的平均值作為新列的列?
例如,在此數據集中:
zz <-("
id 20_1 20_2 20_3 22_1 22_2 22_3
1 . 4.00 3.50 5.80 5.35 5.15
2 3.50 . 3.30 5.65 5.40 5.05
3 2.80 3.40 3.80 5.30 5.25 5.30
")
df <- read.table(text=zz, header = TRUE)
我想創建兩個新列20_4和22_4,其平均行值分別為20_1:20_3和22_1:22_3 ...
id 20_1 20_2 20_3 20_4 22_1 22_2 22_3 22_4
1 NA 4.00 3.50 3.75 5.80 5.35 5.15 5.43
2 3.50 NA 3.30 3.40 5.65 5.40 5.05 5.37
3 2.80 3.40 3.80 3.33 5.30 5.25 5.30 5.28
有人可以幫我嗎? 我還在學習dplyr ...
一個很好的解決方案可能是使用非標准評估:
讓我們考慮一下與您相似的df:
zz = data_frame(
`20_1` = rnorm(5),
`20_2` = rnorm(5),
`20_3` = rnorm(5),
`22_1` = rnorm(5),
`22_2` = rnorm(5),
`22_3` = rnorm(5)
)
首先,我們創建一個字符向量,其中包含我們要平均的列的名稱。 以下代碼將動態選擇所有以20_開頭的列名:
to_aggregate = names(zz)[grepl("^20", names(zz))]
我們創建一個可以動態計算均值的公式:
agg_formula = as.formula(paste0(" ~ mean(c(", paste0("`", to_aggregate, "`", collapse = ", "), "))"))
這將創建公式:〜mean(c('20_1','20_2','20_3'))
我們可以使用dplyr逐行並應用上面生成的動態公式:
zz %>% mutate(tmp_ID = row_number()) %>% group_by(tmp_ID) %>% mutate_(.dots = setNames(list(agg_formula), 'res')) %>% mutate(check_res = (`20_1` + `20_2` + `20_3`) / 3) %>% ungroup()
另一種方法是在dplyr中使用“匯總”來創建所需的變量
zznew<-zz %>%
group_by(id)%>%
summarize("20_4"=mean(`20_1`:`20_3`,na.rm=TRUE),"22_4"=mean(`22_1`:`22_3`,na.rm=TRUE))%>%
left_join(zz,zznew,by="id")
編輯:回想起來,我認為使用“總結”是不正確的。 這是一種不同的方法,它將為選定的列計算每一行的均值並將其綁定到數據框:
zzz<-cbind(zz,"20_4"=rowMeans(zz[,c("20_1","20_2","20_3")],na.rm=TRUE),
"22_4"=rowMeans(zz[,c("22_1","22_2","22_3")],na.rm=TRUE))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.