我有一个包含项目信息的数据框,其中包括一个包含人员和角色的列。我试图根据他们的角色过滤员工。
数据如下:
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,然后进行拆分。我不明白为什么。
有什么建议吗?
感谢。
布兰登
答案 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