#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