使用lapply后将列名称指定为行名称

时间:2017-08-13 11:21:34

标签: r lapply tapply

就像问题一样,我想在R中分配由lapply和tapply处理的列名。一个简单的例子:

admin_user

将导致:

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)

从中我无法判断第1行是否来自&#39; X1&#39;或者&#39; X2&#39;。我想要的是:

            A          B
1 -0.06856352 0.08608197
2 -0.23585510 0.01551267

虽然我们可以在这个例子中做一个简单的手动检查,并且大胆猜测第1行来自&#39; X1&#39;但是当有更多变量和功能更加复杂时,这将变得乏味且有风险比平均值。

任何人都知道如何实现这一目标?你的时间和知识将深受赞赏。提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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