R数据帧中的重复特定行

时间:2018-01-27 03:11:13

标签: r loops dataframe row

我有一个体面的大小由不同的人完成的任务数据框(以及其他列中有关该任务的其他信息)。

如果我得到一个频率计数,谁做了多少任务,我会得到类似这样的示例数据:

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答案)rbindfor循环不混合。这应该是一个简单的操作似乎太多了。

问题

更快或更“正确”的方法是什么?

1 个答案:

答案 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