在数据帧中逐行过滤

时间:2017-05-19 14:53:28

标签: r list dataframe filter

我有一个包含项目信息的数据框,其中包括一个包含人员和角色的列。我试图根据他们的角色过滤员工。

数据如下:

print(1 red and 2 blue squares detected)

我试图按角色过滤掉名称,但无法让它发挥作用。因此,例如,如果我只想要角色2,那么输出将是:

project, staff  
project1, 'jane (role1), john (role2), bob (role3)'  
project2, 'sue (role2), bob (role3)'  
project3, 'mike (role1), claire (role3)'  

我尝试了

的变体
project, staff  
project1, john  
project2, sue  
project3, NA  

str_subset(str_split(df$staff,","),"role2")

但它不起作用。

如果团队中没有人在角色2中,我会得到一个空列表(这很好)。如果团队中有人担任角色2,我会得到所有团队成员的列表(不好)。操作顺序似乎存在问题 - 它检查字符串是否为role2,然后进行拆分。我不明白为什么。

有什么建议吗?

感谢。

布兰登

2 个答案:

答案 0 :(得分:0)

你可以试试这个。可能会有一种更清洁的方式,但这会让你得到你想要的东西。

df <- read.table(text= "project1, 'jane (role1), john (role2), bob (role3)'
project2, 'sue (role2), bob (role3)'
           project3, 'mike (role1), claire (role3)'", stringsAsFactors = FALSE)

temp <- strsplit(df$V2, ',', fixed = T)
temp <- sapply(temp, function(x){
  x[grep('role2', x)]
})
ndf <- data.frame(cbind(df$V1, temp))

答案 1 :(得分:0)

试试这个(请参阅代码中的注释以获得解释):

df <- data.frame(project = c("project1","project2","project3"),
                 staff = c('jane (role1), john (role2), bob (role3)','sue (role2), bob (role3)','mike (role1), claire (role3)'))    

# 1st we split the concatenated field and cbind it to the project, then rbind it all
df2 <- setNames(as.data.frame(do.call(rbind,apply(df,1,function(row){cbind(row[1],strsplit(row[2],", ")[[1]])}))),c("project","staff")) 
# then we separate name and role
df2$role <- gsub(".*\\((.*)\\)", "\\1", df2[,2])
df2$name <- gsub(" \\((.*)\\)", "", df2[,2])
# then we subset what we need
subset(df2,role=="role2")
# project        staff  role name
# 2 project1 john (role2) role2 john
# 4 project2  sue (role2) role2  sue