快速汇总R数据帧中的多个列

sah*_*ahn 3 r dataframe dplyr

我有一个类似的数据框mtcars,以及一个列名称的字符串向量c("mpg", "cyl", "disp", "hp", "drat"),我希望将所有列加在一起成为一个新的列.

我通常会使用类似的东西

mtcars %>% transmute(new_col = mpg + cyl + disp + hp + drat)

   new_col
1   300.90
2   300.90
3   231.65
4   398.48
5   564.85
6   356.86
7   630.51
Run Code Online (Sandbox Code Playgroud)

但是,如果您有一个存储在向量中的100个列名,这将变得非常繁琐.

所以我的问题是,有没有一种方法可以将许多列汇总在一起,列名称保存在字符串向量中?

Ant*_*osK 7

这是使用的替代方法 tidyverse

library(tidyverse)

# input columns of interest
cols = c("mpg", "cyl", "disp", "hp", "drat")

mtcars %>% 
  group_by(id = row_number()) %>%  # for each row
  nest(cols) %>%                   # nest selected columns
  mutate(SUM = map_dbl(data, sum)) # calculate the sum of those columns

# # A tibble: 32 x 3
#      id data               SUM
#   <int> <list>           <dbl>
# 1     1 <tibble [1 x 5]>  301.
# 2     2 <tibble [1 x 5]>  301.
# 3     3 <tibble [1 x 5]>  232.
# 4     4 <tibble [1 x 5]>  398.
# 5     5 <tibble [1 x 5]>  565.
# 6     6 <tibble [1 x 5]>  357.
# 7     7 <tibble [1 x 5]>  631.
# 8     8 <tibble [1 x 5]>  241.
# 9     9 <tibble [1 x 5]>  267.
# 10    10 <tibble [1 x 5]>  320.
# # ... with 22 more rows
Run Code Online (Sandbox Code Playgroud)

这里的输出是一个包含行 id ( id)的数据框,每行使用的数据 (data ) 和计算出的总和 ( SUM)。

SUM如果添加 ,您可以获得计算的向量... %>% pull(SUM)

  • 不错的(+1)。如果你想保留其他非`cols`列,你可以使用`rowwise`代替`group_by(id = row_number())`,即`mtcars %&gt;% rowwise() %&gt;% nest(cols) %&gt; % mutate(SUM = map_dbl(data, sum))`。 (2认同)

小智 7

使用 Base 函数应用

mtcars$NewCol <- as.numeric(apply(mtcars[,1:5], 1, sum))
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb NewCol
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 300.90
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 300.90
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 231.65
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 398.48
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 564.85
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 356.86
Run Code Online (Sandbox Code Playgroud)


RSK*_*RSK 6

使用rowSums功能.

colnms=c("mpg", "cyl", "disp", "hp", "drat")
mtcars$new_col<-rowSums(mtcars[,colnms])
Run Code Online (Sandbox Code Playgroud)