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

时间:2018-08-29 10:47:43

标签: 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

但是,当向量中存储有100个列名时,这变得非常繁琐。

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

5 个答案:

答案 0 :(得分:5)

使用rowSums函数。

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

答案 1 :(得分:3)

使用基本功能

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

答案 2 :(得分:2)

这是使用this.results = this.myForm.controls.myFormNameDrop.valueChanges.pipe( ... 的另一种方法:

tidyverse

此处的输出是一个数据帧,其中包含行ID(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 ),每行使用的数据(id)和计算得出的总和(data)。

如果添加SUM,则可以获得计算出的SUM的向量。

答案 3 :(得分:1)

RSK的好建议

您还可以使用Apply

cols <- c('mpg','cyl','disp','hp','drat')
mtcars$new_col <- apply(mtcars[,cols],1,sum)

答案 4 :(得分:0)

两种方法之间的混合:

mtcars %>% select(cols) %>% transmute(x=rowSums(.))