2017-08-13 32 views
2

像的问题后,我要分配这些都是由lapply和tapply在R.一个简单的例子进行处理的列名:分配的列名行的名称使用lapply

df<-data.frame('X1'=rnorm(100), 
       'X2'=rnorm(100), 
       'X3'=c(c(rep('A',50)),c(rep('B',50)))) 


var<-c('X1','X2') 
plyr::ldply(lapply(var, function(v) { 
    tapply(df[,v],df$X3,mean) 
}),rbind) 

,这将导致为:

  A   B 
1 -0.06856352 0.08608197 
2 -0.23585510 0.01551267 

从中我无法判断第1行是来自'X1'还是'X2'。我要的是:

  A   B 
X1 -0.06856352 0.08608197 
X2 -0.23585510 0.01551267 

虽然我们可以做在这个例子中一个简单的手工检查和一个大胆的猜测,第1行是从“X1”,然而,这会时,有很多更多的变量变得繁琐和危险的,功能比平均值复杂得多。

任何人都知道如何做到这一点?您的时间和知识将深受赞赏。提前致谢。

+1

为什么不'骨料(。〜X3,DF,平均)'或'吨(合计(。〜X3,DF,平均) ,-1])'? – Sotos

+1

或'group_by(df,X3)%>%summarise_each(funs(mean))' – coffeinjunky

+0

感谢Sotos和coffeinjunky,这两个评论让我更接近我想要的解决方案。汇总,group_by,summarise_each函数为我提供了处理这类问题的新工具,我太过沉迷于应用函数。 –

回答

1

我们也可以使用summarise_atcolumn_to_rownames

library(tidyverse) 
df %>% 
    group_by(X3) %>% 
    summarise_at(vars(var), mean) %>% 
    as.data.frame() %>% 
    column_to_rownames("X3") %>% 
    t 
#   A   B 
#X1 -0.1720188 0.1834966 
#X2 0.1413389 0.1138864 
+1

感谢您的回复@akrun,您的代码看起来非常整洁优雅,完美地解决了我的问题。我会以此作为答案。 –

1

只是为了充实我的意见:很多人喜欢用dplyr做拆分应用组合操作。见例如如下:

library(dplyr) 

set.seed(1) 
df<-data.frame('X1'=rnorm(100), 
       'X2'=rnorm(100), 
       'X3'=c(c(rep('A',50)),c(rep('B',50)))) 

var<-c('X1','X2') 

out <- df %>% group_by(X3) %>% select_(.dots = var) %>% summarise_each(funs(mean)) 
out 

# A tibble: 2 × 3 
     X3  X1   X2 
    <fctr>  <dbl>  <dbl> 
1  A 0.1004483 -0.15248544 
2  B 0.1173265 0.07686929 

如果您想要应用更多的功能或应用更复杂的功能,它的工作方式是相同的。例如,应用两个功能:

df %>% group_by(X3) %>% select_(.dots = var) %>% summarise_each(funs(mean, sd)) 

# A tibble: 2 × 5 
     X3 X1_mean  X2_mean  X1_sd  X2_sd 
    <fctr>  <dbl>  <dbl>  <dbl>  <dbl> 
1  A 0.1004483 -0.15248544 0.8313939 0.8997394 
2  B 0.1173265 0.07686929 0.9688279 1.0086725 

如果您确实希望这样做,您可以轻松调换结果。

transposed <- t(out[,-1]) 
colnames(transposed) <- t(out[,1]) 
transposed 
      A   B 
X1 0.1004483 0.11732645 
X2 -0.1524854 0.07686929 
+0

感谢您的回复@ coffeinjunky,您的代码完美解决了我的问题,详细的插图也非常有帮助,特别是您提到的多个功能。不幸的是,上面的akrun的回答也是有效的,他提前一点提供了,因此我以他的答案作为答案。虽然我想让它成为一个答案,但我会标记为有用,但是,您知道,stackoverflow不会允许我这样做。 –