Как вычислить средние значения для каждой строки в фрейме данных? [R]

#r

#r

Вопрос:

Вот df:

     # A tibble: 6 x 5
      t      a      b       c       d
  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1 3999. 0.00586 0.00986 0.00728 0.00856
2 3998. 0.0057  0.00958 0.00702 0.00827
3 3997. 0.00580 0.00962 0.00711 0.00839
4 3996. 0.00602 0.00993 0.00726 0.00875
  

Я хочу получить средние значения для всех строк, за исключением того, что они не включают первый столбец. Код, который я написал:

 df$Mean <- rowMeans(df[select(df, -"t")])
  

Ошибка, которую я получаю:

     Error: Must subset columns with a valid subscript vector.
x Subscript `select(group1, -"t")` has the wrong type `tbl_df<
  p2 : double
  p8 : double
  p10: double
  p9 : double
>`.
ℹ It must be logical, numeric, or character.
  

Я попытался преобразовать df в матрицу, но затем я получаю другую ошибку. Как я должен это решить?

Теперь я пытаюсь вычислить стандартную ошибку, используя код:

 se <- function(x){sd(df[,x])/sqrt(length(df[,x]))}
sapply(group1[,2:5],se)
  

Я пытаюсь указать, какие столбцы следует использовать для вычисления ошибки, но снова появляется ошибка:

  Error: Must subset columns with a valid subscript vector.
x Can't convert from `x` <double> to <integer> due to loss of precision.
  

Я использовал допустимые индексы столбцов, поэтому я не знаю, почему ошибка.

Ответ №1:

Аналогичным base R решением было бы:

 df$Mean <- rowMeans(df[,-1],na.rm=T)
  

Вывод:

      t       a       b       c       d      Mean
1 3999 0.00586 0.00986 0.00728 0.00856 0.0078900
2 3998 0.00570 0.00958 0.00702 0.00827 0.0076425
3 3997 0.00580 0.00962 0.00711 0.00839 0.0077300
4 3996 0.00602 0.00993 0.00726 0.00875 0.0079900
  

Ответ №2:

Мы можем использовать setdiff для возврата столбцов, которые не являются ‘t’, а затем получить rowMeans . Это предполагает, что столбец ‘t’ может находиться где угодно и не зависит от положения столбца

 df$Mean <- rowMeans(df[setdiff(names(df), "t")], na.rm = TRUE)
df
#     t       a       b       c       d      Mean
#1 3999 0.00586 0.00986 0.00728 0.00856 0.0078900
#2 3998 0.00570 0.00958 0.00702 0.00827 0.0076425
#3 3997 0.00580 0.00962 0.00711 0.00839 0.0077300
#4 3996 0.00602 0.00993 0.00726 0.00875 0.0079900
  

select from dplyr возвращает подмножество data.frame, а не имена столбцов или индекс. Итак, мы можем напрямую применить rowMeans

 library(dplyr)
rowMeans(select(df, -t), na.rm = TRUE)
  

Или в канале

 df <- df %>%
         mutate(Mean = rowMeans(select(., -t), na.rm = TRUE))
  

Обновить

Если нам нужно получить стандартную ошибку для каждой строки, мы можем использовать apply with MARGIN как 1

 apply(df[setdiff(names(df), 't')], 1, 
            function(x) sd(x)/sqrt(length(x)))
  

Или с rowSds из matrixStats

 library(matrixStats)
rowSds(as.matrix(df[setdiff(names(df), 't')]))/sqrt(ncol(df)-1)
  

данные

 df <- structure(list(t = c(3999, 3998, 3997, 3996), a = c(0.00586, 
0.0057, 0.0058, 0.00602), b = c(0.00986, 0.00958, 0.00962, 0.00993
), c = c(0.00728, 0.00702, 0.00711, 0.00726), d = c(0.00856, 
0.00827, 0.00839, 0.00875)), class = "data.frame", row.names = c("1", 
"2", "3", "4"))