以列名为条件的行和
Rowsums conditional on column name
我的 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
就可以删除了。
您可以尝试将 rowSums
与 grep
结合使用:
df %>% mutate(AUS_sum = rowSums(.[grep("AUS", names(.))]))
这是另一个使用 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
的开发版本(即将发布 0.6.0
),我们可以使用 quosures
创建一个函数并使其更加动态。在这里,enquo
与 base R
中的 substitute
具有相似的功能,通过获取输入参数并将其转换为 quosure
,使用 quo_name
,我们将其转换为字符串其中 matches
采用字符串参数。 lhs 名称也可以创建为字符串 ('newN') 并且在 mutate/summarise/group_by
中,我们取消引用 (!!
或 UQ
) 来计算字符串
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
根据 OP 对其他 post 关于删除用于 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
数据
df1 <- structure(list(VAR1 = c("A", "B"), VAR2 = c("D", "D"), AUS1 = c(23L,
55L), AUS2 = c(234L, 76L), AUS3 = c(34L, 55L), AUS4 = c(856L,
36L), AUS56 = c(99L, 6456L), VAR3 = c(0L, 0L), VAR4 = c("FCK",
"XYC")), .Names = c("VAR1", "VAR2", "AUS1", "AUS2", "AUS3", "AUS4",
"AUS56", "VAR3", "VAR4"), class = "data.frame", row.names = c(NA,
-2L))
在基数 R 中:
df$AUS <- rowSums(df[,grep('AUS', names(df))])
我的 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
就可以删除了。
您可以尝试将 rowSums
与 grep
结合使用:
df %>% mutate(AUS_sum = rowSums(.[grep("AUS", names(.))]))
这是另一个使用 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
的开发版本(即将发布 0.6.0
),我们可以使用 quosures
创建一个函数并使其更加动态。在这里,enquo
与 base R
中的 substitute
具有相似的功能,通过获取输入参数并将其转换为 quosure
,使用 quo_name
,我们将其转换为字符串其中 matches
采用字符串参数。 lhs 名称也可以创建为字符串 ('newN') 并且在 mutate/summarise/group_by
中,我们取消引用 (!!
或 UQ
) 来计算字符串
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
根据 OP 对其他 post 关于删除用于 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
数据
df1 <- structure(list(VAR1 = c("A", "B"), VAR2 = c("D", "D"), AUS1 = c(23L,
55L), AUS2 = c(234L, 76L), AUS3 = c(34L, 55L), AUS4 = c(856L,
36L), AUS56 = c(99L, 6456L), VAR3 = c(0L, 0L), VAR4 = c("FCK",
"XYC")), .Names = c("VAR1", "VAR2", "AUS1", "AUS2", "AUS3", "AUS4",
"AUS56", "VAR3", "VAR4"), class = "data.frame", row.names = c(NA,
-2L))
在基数 R 中:
df$AUS <- rowSums(df[,grep('AUS', names(df))])