2016-05-16 67 views
0

有没有办法将具有其他现有列的平均值的新列以特定文本开头?dplyr中的mutate_each:使用其他列的平均行值与一些文本相同的方式创建新列

例如,在这组数据:

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,并与20_1的平均行值22_4: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 

有人可以帮我吗? I'm还在学习dplyr ...

+0

你真的'.'您的数据,或者是你想模仿'NA'? –

+0

谢谢!编辑问题.. – Juanchi

回答

0

另一种方式做,这将是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)) 
+0

有什么问题,因为它给20_4 =(2,3,2.5)时应该是20_4 =(3.75,3.4,3.33) – Juanchi

+0

对不起,我编辑了答案,添加了一个不同的方法,应该可以工作 – collnell

+0

这是dplyr的一个很好的解决方案...我认为用mutate_each()可能很简单,谢谢! – Juanchi

0

对此的优雅的解决方案可能会被使用非标准的评价:

让我们考虑类似你这样的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_6:

    to_aggregate = names(zz)[grepl("^20", names(zz))] 
    
  2. 我们创建一个公式,动态计算平均值:

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

    这将创建公式: 〜意思是(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() 
    
+0

它给我这个错误...''在解析错误(文本= x,keep.source = FALSE): :1:13:意外输入 1:〜mean(c(20_ ^' – Juanchi

+0

是的,你得到的错误,因为列名称具有无效的名称,所以你需要用\\包装它们。我现在更改了agg_formula在行名前后有“'”,现在它将工作 –

相关问题