簡體   English   中英

dplyr中的mutate_each:使用其他具有相同文本的列的平均行值創建新列

[英]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)
)
  1. 首先,我們創建一個字符向量,其中包含我們要平均的列的名稱。 以下代碼將動態選擇所有以20_開頭的列名:

     to_aggregate = names(zz)[grepl("^20", names(zz))] 
  2. 我們創建一個可以動態計算均值的公式:

     agg_formula = as.formula(paste0(" ~ mean(c(", paste0("`", to_aggregate, "`", collapse = ", "), "))")) 

    這將創建公式:〜mean(c('20_1','20_2','20_3'))

  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.

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