【问题标题】:assign column names as row names after using lapply使用 lapply 后将列名指定为行名
【发布时间】:2017-08-13 11:21:33
【问题描述】:

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

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”,但是当变量更多且函数比平均值复杂得多时,这将变得乏味和冒险。

有人知道如何实现吗?您的时间和知识将不胜感激。提前致谢。

【问题讨论】:

  • 为什么不只是aggregate(. ~ X3, df, mean)t(aggregate(. ~ X3, df, mean)[,-1])
  • group_by(df, X3) %&gt;% summarise_each(funs(mean))
  • 感谢 Sotos 和 coffeinjunky,你们的两位 cmets 让我离我想要的解决方案更近了一步。聚合、group_by、summarise_each 函数为我提供了处理此类问题的新工具,我太沉迷于应用函数了。

标签: r lapply tapply


【解决方案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

【讨论】:

  • 感谢@akrun 的回复,您的代码看起来非常整洁优雅,完美解决了我的问题。我会把它作为答案。
【解决方案2】:

只是为了充实我的评论:很多人喜欢使用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

【讨论】:

  • 感谢您的回复@coffeinjunky,您的代码完美解决了我的问题,而且详细的插图也很有帮助,尤其是您提到的多个功能。不幸的是,akrun 上面的回答也有效,而且他提供的早一点,所以我把他作为答案。尽管我也想将其作为答案,但我会将您的标记为有用,但是,您知道,stackoverflow 不允许我这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2016-12-14
  • 2022-01-14
  • 2020-10-18
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多