Rowsums以列名为条件

时间:2017-04-20 09:45:41

标签: r dplyr rowsum

我的data.frage看起来像这样:

   VAR1 VAR2 AUS1 AUS2 AUS3 AUS4 ... AUS56 VAR3 VAR4
   A    D    23   234  34   856  ... 99    0    FCK
   B    D    55   76   55   36   ... 6456  0    XYC

我希望R添加一个新变量AUS,它显示变量AUS1AUS56的行数,最好是dplyr。然后可以删除AUS1AUS56

3 个答案:

答案 0 :(得分:3)

您可以尝试将rowSumsgrep结合使用:

df %>% mutate(AUS_sum = rowSums(.[grep("AUS", names(.))]))

答案 1 :(得分:2)

这是使用tidyverse语法

的另一个选项
library(tidyverse)
df1 %>% 
     select(matches("AUS")) %>% 
     reduce(`+`) %>%
     mutate(df1, AUS_sum = .)
#   VAR1 VAR2 AUS1 AUS2 AUS3 AUS4 AUS56 VAR3 VAR4 AUS_sum
#1    A    D   23  234   34  856    99    0  FCK    1246
#2    B    D   55   76   55   36  6456    0  XYC    6678

使用dplyr的devel版本(即将发布0.6.0),我们可以使用quosures创建一个函数,并使其更具动态性。在这里,enquo通过获取输入参数并将其转换为substitutebase Rquosure的{​​{1}}功能类似,我们将其转换为字符串其中quo_name采用字符串参数。 lhs名称也可以创建为字符串('newN'),在matches内,我们取消引用(mutate/summarise/group_by!!)来评估字符串

UQ

根据OP对另一篇关于删除用于fSum <- function(dat, pat){ pat <- quo_name(enquo(pat)) newN <- paste0(pat, "_sum") newSum <- dat %>% select(matches(pat)) %>% reduce(`+`) dat %>% mutate(!!newN := newSum) } fSum(df1, AUS) # VAR1 VAR2 AUS1 AUS2 AUS3 AUS4 AUS56 VAR3 VAR4 AUS_sum #1 A D 23 234 34 856 99 0 FCK 1246 #2 B D 55 76 55 36 6456 0 XYC 6678 的列的帖子的评论,我们可以修改函数

sum

数据

fSumN <- function(dat, pat){
  pat <- quo_name(enquo(pat))
  newN <- paste0(pat, "_sum")
  newSum <- dat %>%
            select(matches(pat)) %>%
            reduce(`+`)
  dat %>%
       select(-matches(pat)) %>%
       mutate(!!newN :=  newSum)
}

fSumN(df1, AUS)
#     VAR1 VAR2 VAR3 VAR4 AUS_sum
#1    A    D    0  FCK    1246
#2    B    D    0  XYC    6678

答案 2 :(得分:0)

在基地R:

df$AUS <- rowSums(df[,grep('AUS', names(df))])