2017-04-07 10 views
0

エンティティの曖昧さ回避プロジェクトを実行しています。同じ名前の著者のデータフレームがあり、次の列:author IDcoauthor namesです。コンマで区切られた文字列の数を検索し、文字列を出力します。

投稿者IDで特定された著者と、以前に仕事をしていたすべての同意者との間の番号協力を見つける必要があります。ここで

は、データフレームのサンプルです:

author.ID    coauthor.names 
    1     J Smith, A Greer 
    1     J Adams, J Smith 
    2     D Richardson, J Smith 

私は出力になりたい:

author.ID  coauthor.name  collaboration.times 
    1    J Smith    2 
    1    J Adams    1 
    1    A Greer    1 
    2    D Richardson   1 
    2    J Smith    1 

私は特定して、著者のすべての共著者(カンマで区切る)を組み合わせて試してみました著者のIDを1つの大きな文字列に変換し、この巨大な文字列にstr_countstringrパッケージを使用しようとしていますが、この問題を解決する正しい方法があるかどうかはわかりません。

この問題をより効率的に、またはエレガントに回避する方法はありますか?

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

答えて

3

あなたは、このようなデータを扱っていると仮定:

mydf <- structure(list(author.ID = c(1L, 1L, 2L), coauthor.names = c("J Smith, A Greer", 
    "J Adams, J Smith", "D Richardson, J Smith")), .Names = c("author.ID", 
    "coauthor.names"), row.names = c(NA, 3L), class = "data.frame") 
mydf 
## author.ID  coauthor.names 
## 1   1  J Smith, A Greer 
## 2   1  J Adams, J Smith 
## 3   2 D Richardson, J Smith 

...あなたは私の "splitstackshape" パッケージからcSplitを試してみて、それから "data.table" から.Nに集約することができます

library(splitstackshape) 
cSplit(mydf, "coauthor.names", ",", "long")[ 
    , list(collaboaration.times = .N), .(author.ID, coauthor.names)][] 
# author.ID coauthor.names collaboaration.times 
# 1:   1  J Smith     2 
# 2:   1  A Greer     1 
# 3:   1  J Adams     1 
# 4:   2 D Richardson     1 
# 5:   2  J Smith     1 

あなたは、このようなデータを扱っていると仮定:

mydf2 <- structure(list(author.ID = c(1L, 1L, 2L), coauthor.names = structure(list(
     c("J Smith", "A Greer"), c("J Adams", "J Smith"), c("D Richardson", 
     "J Smith")), class = "AsIs")), .Names = c("author.ID", "coauthor.names" 
    ), row.names = c(NA, 3L), class = "data.frame") 
mydf2 
## author.ID coauthor.names 
## 1   1 J Smith,.... 
## 2   1 J Adams,.... 
## 3   2 D Richar.... 

... listCol_l(やはり "splitstackshape"から)で始まり、同様にカウントできます。

listCol_l(mydf2, "coauthor.names")[ 
    , list(collaboration.times = .N), .(author.ID, coauthor.names_ul)] 
# author.ID coauthor.names_ul collaboration.times 
# 1:   1   J Smith     2 
# 2:   1   A Greer     1 
# 3:   1   J Adams     1 
# 4:   2  D Richardson     1 
# 5:   2   J Smith     1 

"tidyverse" 同等物は、このようなものかもしれません:

library(tidyverse) 
# For a single character string as "coauthor.names" 
mydf %>% 
    mutate(coauthor.names = lapply(strsplit(coauthor.names, ","), trimws)) %>% 
    unnest() %>% 
    group_by(author.ID, coauthor.names) %>% 
    summarise(collaboration.times = n()) 

# If "coauthor.names" is already a `list`. 
mydf2 %>% 
    unnest() %>% 
    group_by(author.ID, coauthor.names) %>% 
    summarise(collaboration.times = n()) 
+0

ありがとうございました。今私は進めることができます! – Waht

関連する問題