我有一个体面的大小由不同的人完成的任务数据框(以及其他列中有关该任务的其他信息)。
如果我得到一个频率计数,谁做了多少任务,我会得到类似这样的示例数据:
Name Count
John 27
Jack 14
Jill 31
John,Jack 7
Jack and Jill 11
John/Jill 3
Jack+John,Jill 1
我的目标是复制多人完成的工作。如果我运行频率计数,我想要这样的东西:
Name Count
John 35
Jack 33
Jill 46
我需要复制多个人在工作中工作的数据框的任何行,以便将相同的工作列为仅由每个工作的人完成。
我有一个所有名字的列表,但没有放在它们之间的各种连接器(我有Jack + Jill,Jack / Jill,Jack和Jill,以及名字之间的其他连接)。
我对R很新,我把它写成:
unlisted = unlist(data$"Name")
temp1 = data[grepl(employeenames[1], unlisted, fixed = TRUE), ]
temp1[, "Name"] = employeenames[1]
for(i in 2:length(employeenames)){
temp2 = data[grepl(employeenames[i], unlisted, fixed = TRUE), ]
temp2[ ,"Name"] = employeenames[i]
temp1 = rbind(temp1, temp2)
}
data = temp1
据我所见,这是有效的,但我已经多次被告知(或者更确切地说,读取了人们被告知的stackoverflow答案)rbind
和for
循环不混合。这应该是一个简单的操作似乎太多了。
问题
更快或更“正确”的方法是什么?
答案 0 :(得分:1)
这是一个整齐的版本:
library(tidyverse)
df <- data_frame(Name = c("John", "Jack", "Jill", "John,Jack", "Jack and Jill", "John/Jill", "Jack+John,Jill"),
Count = c(27L, 14L, 31L, 7L, 11L, 3L, 1L))
df %>%
separate_rows(Name, sep = '[,/+]| and ') %>%
group_by(Name) %>%
summarise(Count = sum(Count))
#> # A tibble: 3 x 2
#> Name Count
#> <chr> <int>
#> 1 Jack 33
#> 2 Jill 46
#> 3 John 38