Как получить среднее значение векторов в списках с одинаковыми именами внутри цикла for в R - PullRequest
1 голос
/ 03 мая 2019

Вот небольшой пример того, что я пытаюсь сделать.

ex1 <- c(1,2,3)
nm <- c("cone","ctwo","cthree") 
names(ex1) <- nm

ex2 <- c(1.3,1.5,1.6)
names(ex2) <- nm

ex3 <- c(1.4,1.6,1.8)
names(ex3) <- nm

ex <- list(ex1,ex2,ex3)

for (i in seq(ex))
{
   ab<- ex[[i]]
}

Вывод, который я получаю:

  ab
  cone   ctwo cthree 
  1.4    1.6    1.8

Но ожидаемый результат должен быть примерно таким.

  ab
  cone   ctwo cthree 
  1.233    1.7    2.133

Это дает средние значения конуса ctwo и cthree из трех векторов в списке.

Ответы [ 4 ]

4 голосов
/ 03 мая 2019

Мы можем использовать colMeans после rbind элементов list

colMeans(do.call(rbind, ex))
#    cone     ctwo   cthree 
#1.233333 1.700000 2.133333 

Если у нас есть объекты, созданные в глобальной среде с именем, начинающимся с 'ex', за которым следуют цифры, получите все из них в list с mget и затем примените код, как указано выше

colMeans(do.call(rbind, mget(ls(pattern = "ex\\d+")))) 

Или используя Reduce

Reduce(`+`, ex)/length(ex)

Или используя for цикл

n <- length(ex)
v1 <- numeric(n)
for(i in seq_along(ex)) v1 <- v1 + ex[[i]]
v1/m
3 голосов
/ 03 мая 2019

Другой способ будет таким:

> rowMeans(data.frame(ex))
    cone     ctwo   cthree 
1.233333 1.700000 2.133333
2 голосов
/ 03 мая 2019

Возможно, вычислительно медленно, но мы можем использовать plyr:

 sapply(plyr::ldply(ex),mean)
    cone     ctwo   cthree 
1.233333 1.700000 2.133333 
2 голосов
/ 03 мая 2019

Назовите элементы списка в ex:

ex <- list(ex1 = ex1, ex2 = ex2, ex3 = ex3)

затем найдите среднее значение по строке:

apply(as.data.frame(ex), 1, mean)

    cone     ctwo   cthree 
1.233333 1.700000 2.133333 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...