R dplyr / array упрощает добавление столбца с помощью rowmeans

#r #dplyr #rowwise

#r #dplyr #по строкам

Вопрос:

У меня есть фрейм данных, в котором я хочу удалить все строки и добавить последний столбец, который имеет среднее значение. Я не хочу жестко кодировать имена столбцов, и я в порядке с использованием массивов / матриц (хотя мне было бы интересно изучить его функционально и в dplyr). Предположим, я начну с

  tibble(x=seq(1.0,4.0),y=seq(5.,8))
# A tibble: 4 x 2
      x     y
  <int> <int>
1     1     5
2     2     6
3     3     7
4     4     8
  

Я хочу, чтобы в итоге

       x     y     z
  <dbl> <dbl> <int>
1    -2     2     3
2    -2     2     4
3    -2     2     5
4    -2     2     6

  

Спасибо за любую помощь!

Ответ №1:

Вы можете использовать rowwise()

 library(dplyr)

df <- tibble(x = seq(1.0, 4.0),y = seq(5., 8))

df %>% 
  rowwise() %>% 
  mutate(avg = mean(c_across(x:y))) %>% 
  mutate(across(c(x:y), ~ .x - avg))
#> # A tibble: 4 x 3
#> # Rowwise: 
#>       x     y   avg
#>   <dbl> <dbl> <dbl>
#> 1    -2     2     3
#> 2    -2     2     4
#> 3    -2     2     5
#> 4    -2     2     6
  

Создано 2020-09-23 пакетом reprex (версия 0.3.0)

Ответ №2:

Вот базовый подход R с sweep

 df <- data.frame(x=seq(1.0,4.0),y=seq(5.,8))
rm <- rowMeans(df)
df <- sweep(df, 1, rm)
df$z <- rm
df

#   x y z
#1 -2 2 3
#2 -2 2 4
#3 -2 2 5
#4 -2 2 6