我的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
,它显示变量AUS1
到AUS56
的行数,最好是dplyr。然后可以删除AUS1
到AUS56
。
答案 0 :(得分:3)
您可以尝试将rowSums
与grep
结合使用:
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
通过获取输入参数并将其转换为substitute
,base R
与quosure
的{{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))])