对多个在列中具有特定名称的列求和

时间:2019-07-16 22:52:19

标签: r sum

我想将每一行的// assuming 'search' holds the entire data queried from the api const fullListing = [ // car of the week, data reformatted to have an identical structure as // the 'other' cars { id: search.listing.details.identifier.id, details: { vehicle: search.listing.details.vehicle, }, }, ...search.listings.listings, // the 'other' cars ] Var1的值相加,并产生一个标题为Var2的新列,该列给出了Vars和{{1 }}。然后,我想对Var1Var2进行同样的操作,并新建一个标题为Col1的列,该列给出Col2Cols的总和。我该如何编写代码?预先感谢。

Col1

预期结果如下:

Col2

4 个答案:

答案 0 :(得分:3)

假设列ID不相关(无组),并且您很乐意指定列名(解决方案为硬编码,而不是通用)。

基本的R解决方案:

df$Vars <- rowSums(df1[, c("Var1", "Var2")])
df$Cols <- rowSums(df1[, c("Col1", "Col2")])

tidyverse解决方案:

library(dplyr)
library(purrr)

df %>% mutate(Vars = map2_int(Var1, Var2, sum),
              Cols = map2_int(Col1, Col2, sum))

# or just
df %>% mutate(Vars = Var1 + Var2,
              Cols = Col1 + Col2)

答案 1 :(得分:2)

有很多不同的方法可以做到这一点。与

library(dplyr)
df = df %>% #input dataframe
  group_by(ID) %>% #do it for every ID, so every row
  mutate( #add columns to the data frame
    Vars = Var1 + Var2, #do the calculation
    Cols = Col1 + Col2
   )

但是还有许多其他方式,例如,应用功能等。我建议阅读有关tidyverse的信息。

答案 2 :(得分:1)

另一种dplyr方法是使用辅助函数starts_with选择列,然后使用rowSums对这些列求和。

library(dplyr)

df$Vars <- df %>%  select(starts_with("Var")) %>%  rowSums()
df$Cols <-  df %>%  select(starts_with("Col")) %>%  rowSums()

df
#  ID Var1 Var2 Col1 Col2 Vars Cols
#1  1   34   22   34   24   56   58
#2  2    3   25   54   65   28  119
#3  3   87   68   14   78  155   92
#4  4   66   98   98  100  164  198
#5  5   55   13   77    2   68   79

答案 3 :(得分:0)

一个汇总所有列的解决方案的名称相同,并在 base 中使用gsub以数字结尾:

tt <- paste0(gsub('[[:digit:]]+', '', names(df)[-1]),"s")
df <- cbind(df, sapply(unique(tt), function(x) {rowSums(df[grep(x, tt)+1])}))
df
#  ID Var1 Var2 Col1 Col2 Vars Cols
#1  1   34   22   34   24   56   58
#2  2    3   25   54   65   28  119
#3  3   87   68   14   78  155   92
#4  4   66   98   98  100  164  198
#5  5   55   13   77    2   68   79

或更通用的解决方案:

idx <- grep('[[:digit:]]',  names(df))
tt <- paste0(gsub('[[:digit:]]+', '', names(df)[idx]),"s")
df <- cbind(df, sapply(unique(tt), function(x) {rowSums(df[idx[grep(x, tt)]])}))