1

我有一个数据框,我想贬低所有行并添加最后一列具有平均值。我不想对列名进行硬编码,而且我可以使用数组/矩阵(尽管我也有兴趣在 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

谢谢你的帮助!

4

2 回答 2

0

这是一个基本的 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
于 2021-05-23T03:24:59.077 回答
0

您可以使用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

reprex 包(v0.3.0)于 2020 年 9 月 23 日创建

于 2020-09-24T04:30:38.433 回答