Найдите среднее значение нескольких столбцов в dplyr .... почему я получаю повторяющееся значение? - PullRequest
1 голос
/ 05 августа 2020

У меня есть объект x:

x <- structure(list(ID = c("id1", "id2", "id3", "id4", 
"id5", "id6"), FC_C1 = c(1.0237284417215, -1.17547380888546, 
1.24032256483382, -1.26788878671502, -1.02667652234543, 1.08328144665509
), FC_C2 = c(-1.05037736352335, -1.51035519579208, 1.73843567887288, 
-1.06460883435243, -1.1937810921512, 1.32473926867105), FC_C3 = c(-1.04105748916685, 
-1.10813259308926, 1.33943213640751, -1.08323491305538, 1.0928771895575, 
1.20931550695441)), row.names = c(NA, 6L), class = "data.frame")

> x
   ID     FC_C1     FC_C2     FC_C3
1 id1  1.023728 -1.050377 -1.041057
2 id2 -1.175474 -1.510355 -1.108133
3 id3  1.240323  1.738436  1.339432
4 id4 -1.267889 -1.064609 -1.083235
5 id5 -1.026677 -1.193781  1.092877
6 id6  1.083281  1.324739  1.209316

Мне нужен новый столбец с именем FC_average, который представляет собой среднее значение первых трех столбцов (для каждой строки).

Однако, когда я запускаю эту функцию:

meta_x <- x %>% 
    dplyr::mutate(
        FC_average = mean(c(
            FC_C1,
            FC_C2,
            FC_C3)
        ))

, я получаю следующее:

> meta_x
   ID     FC_C1     FC_C2     FC_C3  FC_average
1 id1  1.023728 -1.050377 -1.041057 -0.08163635
2 id2 -1.175474 -1.510355 -1.108133 -0.08163635
3 id3  1.240323  1.738436  1.339432 -0.08163635
4 id4 -1.267889 -1.064609 -1.083235 -0.08163635
5 id5 -1.026677 -1.193781  1.092877 -0.08163635
6 id6  1.083281  1.324739  1.209316 -0.08163635

Почему столбец FC_average не находит среднее значение для каждой строки?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Мы можем использовать векторизованный rowMeans вместо mean

library(dplyr)
x %>% 
    mutate(FC_average = rowMeans(select(., starts_with('FC'))))
1 голос
/ 05 августа 2020

apply() можно использовать для итерации любой функции по строкам или столбцам. Если вам нужно среднее значение каждой строки, вы можете использовать этот код:

apply(x[,2:4], 1,mean) -> x$FC_average

Если по какой-то причине вам нужны средства столбца, вы должны изменить 1 на 2, как в:

apply(x[,2:4], 2, mean)

В вашем коде вы запрашиваете mutate() x с новым столбцом, который представляет собой одно значение - среднее значение этих трех столбцов или -0,08163635. Вот как вы можете использовать существующий код с rowwise()

x %>% 
  rowwise(.) %>% dplyr::mutate(
    FC_average = mean(c(
      FC_C1,
      FC_C2,
      FC_C3)
    ))
...