我想使用dplyr :: mutate计算某些列的平均值。
library(dplyr)
test <- data.frame(replicate(12, sample(1:12, 12, rep = T))) %>%
`colnames<-`(seq(1:12) %>% paste("BL", ., sep = ""))
我想要包括的列来计算平均值只有BL1到BL9,所以我做
test_again <- test %>%
rowwise() %>%
mutate(ave = mean(c(seq(1:9) %>% paste("BL", ., sep = ""))))
这不起作用。我注意到,如果我逐一放置列,它可以正常工作
test_againAndAgain <- test %>%
rowwise() %>%
mutate(ave = mean(c(BL1, BL2, BL3, BL4, BL5, BL6, BL7, BL8, BL9)))
我怀疑它是因为我给了字符串而不是&#34;列&#34;。
有人可以解释这种行为吗?什么是最好的解决方案?
答案 0 :(得分:4)
您可以将rowMeans
与select(., BL1:BL9)
一起使用;此处select(., BL1:BL9)
选择从BL1
到BL9
和rowMeans
的列,计算行平均值;您无法直接在mutate
中使用字符向量作为列,这些列将被视为而不是列:
test %>% mutate(ave = rowMeans(select(., BL1:BL9)))
# BL1 BL2 BL3 BL4 BL5 BL6 BL7 BL8 BL9 BL10 BL11 BL12 ave
#1 5 11 1 1 12 5 10 12 6 11 12 9 7.000000
#2 1 10 5 11 7 6 5 9 9 1 8 4 7.000000
#3 8 10 1 2 7 12 5 9 5 3 3 11 6.555556
#4 5 2 5 4 9 5 5 3 5 2 8 1 4.777778
#5 9 1 1 10 3 5 1 9 9 6 3 12 5.333333
#6 9 7 9 6 3 2 5 4 9 5 1 2 6.000000
#7 3 3 1 9 7 8 7 9 9 11 12 9 6.222222
#8 12 9 3 3 9 11 4 2 5 12 12 12 6.444444
#9 1 7 7 12 6 6 5 3 10 12 5 10 6.333333
#10 12 7 7 1 2 8 5 8 11 9 1 5 6.777778
#11 9 1 5 8 12 6 6 11 3 12 3 9 6.777778
#12 5 6 1 11 10 12 6 7 8 7 8 2 7.333333
答案 1 :(得分:1)
或另一个选项pmap
mean
library(tidyverse)
test %>%
mutate(ave = select(., BL1:BL9) %>%
pmap(~ mean(c(...))))
# BL1 BL2 BL3 BL4 BL5 BL6 BL7 BL8 BL9 BL10 BL11 BL12 ave
#1 5 12 8 5 3 11 7 1 8 1 11 12 6.666667
#2 11 5 5 5 2 10 12 6 6 2 7 5 6.888889
#3 8 11 9 6 10 5 8 8 2 3 6 12 7.444444
#4 2 7 7 12 3 1 1 10 7 4 11 12 5.555556
#5 8 4 12 12 9 12 9 3 5 1 10 12 8.222222
#6 11 11 11 12 3 12 5 8 12 8 2 7 9.444444
#7 2 6 11 5 8 5 5 8 8 4 11 12 6.444444
#8 10 3 9 9 8 12 9 11 8 1 12 11 8.777778
#9 12 3 7 2 3 10 11 9 1 8 9 12 6.444444
#10 1 7 12 9 8 2 11 11 7 2 2 5 7.555556
#11 9 12 2 9 2 6 10 5 10 6 7 4 7.222222
#12 11 6 9 1 4 4 8 8 2 9 3 8 5.888889
注意:由于没有set.seed