Рассчитать среднее значение некоторых столбцов, используя dplyr :: mutate - PullRequest
0 голосов
/ 15 мая 2018

Я хочу вычислить среднее значение некоторых столбцов, используя 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)))

Я подозревал, что это потому, что я даю строки вместо "столбцов".

Может кто-нибудь объяснить такое поведение?Что будет лучшим решением для этого?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Или другой вариант 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

0 голосов
/ 15 мая 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...