2017-05-19 11 views
0

私はスタッフとロールのある列を含むプロジェクト情報を持つデータフレームを持っています。彼らの役割に応じてスタッフをフィルタリングしようとしています。私は役割によって名前をフィルタリングしようとしているが、それは仕事を得ることができないデータフレーム内の行単位でフィルタリング

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

データは次のようになり。私は唯一の役割2をしたいのであれば、例えば、出力は次のようになります。

project, staff 
project1, john 
project2, sue 
project3, NA 

私は

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

grep('role2',str_split(df$staff`,","),value=TRUE) 

のバリエーションを試してみたが、それはしません作業。

チームの誰もロール2にいない場合、空のリストが表示されます(これは良いことです)。チームの誰かがロール2にいる場合は、すべてのチームメンバーのリストが表示されます(不十分です)。操作の順序に問題があるようです - role2の文字列をチェックしてから分割しています。なぜか分からない。

提案がありますか?

ありがとうございました。

ブランドン

答えて

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)) 
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 
関連する問題