使用 lapply 后将列名指定为行名
assign column names as row names after using lapply
像这个问题,我想分配由 lapply 处理的列名并在 R 中应用。一个简单的例子:
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',但是当有更多的变量和函数比均值。
有人知道如何实现吗?您的时间和知识将不胜感激。提前致谢。
只是为了充实我的评论:许多人喜欢使用 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
我们还可以使用 summarise_at
和 column_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
像这个问题,我想分配由 lapply 处理的列名并在 R 中应用。一个简单的例子:
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',但是当有更多的变量和函数比均值。
有人知道如何实现吗?您的时间和知识将不胜感激。提前致谢。
只是为了充实我的评论:许多人喜欢使用 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
我们还可以使用 summarise_at
和 column_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