我想将一系列变量添加到数据框中:
patent <- c(1,2,2)
temp1 <- c(TRUE,FALSE,FALSE)
temp2 <- c(FALSE,TRUE,TRUE)
df <- data.frame(patent,temp1,temp2)
df
patent temp1 temp2
1 TRUE FALSE
2 FALSE TRUE
2 FALSE TRUE
我想做的是通过专利,循环/函数/使用dplyr /等为每个temp var生成列总和。这是我最终要寻找的:
patent temp1 temp2 new1 new2
1 TRUE FALSE 1 0
2 FALSE TRUE 0 2
2 FALSE TRUE 0 2
答案 0 :(得分:1)
您可以尝试以下操作,而无需单独指定每个列
library(dplyr)
df %>%
group_by(patent) %>%
mutate_at(vars(contains("temp")), sum) %>%
ungroup() %>%
select(-patent) %>%
setNames(paste0("new", seq_len(ncol(df)-1))) %>%
cbind(df, .)
# patent temp1 temp2 new1 new2
# 1 1 TRUE FALSE 1 0
# 2 2 FALSE TRUE 0 2
# 3 2 FALSE TRUE 0 2
答案 1 :(得分:1)
另一个dplyr解决方案。我们可以先使用patent
计算每列summarise_all(funs(sum(.)))
的总和,然后使用left_join
将结果加入原始数据框。无需指定单个列名称。
library(dplyr)
df2 <- df %>%
group_by(patent) %>%
summarise_all(funs(sum(.))) %>%
setNames(sub("temp", "new", names(.))) %>%
left_join(df, ., by = "patent")
df2
# patent temp1 temp2 new1 new2
# 1 1 TRUE FALSE 1 0
# 2 2 FALSE TRUE 0 2
# 3 2 FALSE TRUE 0 2
或者我们可以使用mutate_all
来计算总和并将结果存储到新列中。
df2 <- df %>%
group_by(patent) %>%
mutate_all(funs("sum" = sum(.))) %>%
ungroup()
df2
# # A tibble: 3 x 5
# patent temp1 temp2 temp1_sum temp2_sum
# <dbl> <lgl> <lgl> <int> <int>
# 1 1.00 T F 1 0
# 2 2.00 F T 0 2
# 3 2.00 F T 0 2
如果列名称必须与示例完全相同,我们可以执行以下操作。
df2 <- df %>%
group_by(patent) %>%
mutate_all(funs("sum" = sum(.))) %>%
ungroup() %>%
setNames(ifelse(grepl("_sum$", names(.)), sub("temp", "new", names(.)), names(.))) %>%
setNames(sub("_sum$", "", names(.)))
df2
# # A tibble: 3 x 5
# patent temp1 temp2 new1 new2
# <dbl> <lgl> <lgl> <int> <int>
# 1 1.00 T F 1 0
# 2 2.00 F T 0 2
# 3 2.00 F T 0 2
答案 2 :(得分:0)
使用dplyr
即可
library(dplyr)
df %>% group_by(patent) %>%
mutate(new1=sum(temp1), new2=sum(temp2))
# patent temp1 temp2 new1 new2
# <dbl> <lgl> <lgl> <int> <int>
# 1 1 TRUE FALSE 1 0
# 2 2 FALSE TRUE 0 2
# 3 2 FALSE TRUE 0 2