2

テーブルが 2 つあり、table1 には文字列の列があります。別のテーブル table2 で各文字列の一致を見つけたいのですが、対応する table2 列では、各セルに行エントリごとのリストが含まれています。

これまでのところ、grepl を使用して特定のエントリを照合する方法を理解しました。

grepl(table1$label[i],table2$labels[[j]][k])

いくつかの i、j、k について。i と j は、それぞれテーブル 1 とテーブル 2 の行数であるため固定されていますが、k は正の値であるため、次のようなものがあります。

for (i in 1:nrow(table1)){
  for (j in 1:nrow(table2){
    for(k ?){
    grepl(table1$label[i],table2$labels[[j]][k])
    }
  }
}

kループに何を入れればよいかよくわかりません。

table1 文字列を含む table2 行を特定したら、別の table2 列から対応する値を報告し、これらを table1 の対応する文字列行に追加することです。 「さらにいくつかの for ループが必要になるでしょう... このような複数の参照の問題に対する近道はありますか?

いくつかのデータ例 (table2 リストにも値が欠落していることに注意してください。ただし、これらの一致が無視されると想定しています。他のエントリは文字クラスです):

表1

    label 
1   Tom     
2   Gemma     
3   Graham     

表 2 (更新)

     item      labels 
1    Apple     Tom, ,John, ,Terry,     
2    Orange    Bryan, ,Graham,  
3    Pear      Finn, ,Gemma, ,Graham, 

出力

表1

    label   item
1   Tom     Apple
2   Gemma   Pear  
3   Graham  Orange, Pear

使用からdput私は得る

Table1 <- structure(list(label = c("Tom", "Gemma", "Graham")), .Names = "label", 
class = "data.frame", row.names = c(NA, 
-3L))


Table2 <- structure(list(item = c("Apple", "Orange", "Pear"), labels = list(
    structure(c("Tom", "", "John", "", "Terry", ""), .Dim = c(6L, 
    1L)), structure(c("Bryan", "", "Graham", ""), .Dim = c(4L, 
    1L)), structure(c("Finn", "", "Gemma", "", "Graham", ""), .Dim = c(6L, 
    1L)))), .Names = c("item", "labels"), row.names = c(NA, -3L
), class = "data.frame")

補遺: の最初の使用に関して、greplTable2 のラベルの一部は Table1 のラベルと部分的にしか一致しませんが、名前は Table1 で一意であるため、Table1 ラベルの一致を適用したいと思います。たとえばGraham(Table1) Graham(Table2) とGraham Green(Table2 )の両方に

表 2 (バージョン 2)

     item      labels 
1    Apple     Tom, ,John, ,Terry,     
2    Orange    Bryan, ,Graham,  
3    Pear      Finn, ,Gemma, ,Graham Green, 

出力 Table1 は同じになります。

4

2 に答える 2

4

data.tableこれがパッケージを使用した試みです

library(data.table)
res <- setDT(Table2)[, list(label = unlist(labels)), by = item]
setkey(res, label)[Table1, toString(unique(item)), by = .EACHI]
#     label         item
# 1:    Tom        Apple
# 2:  Gemma         Pear
# 3: Graham Orange, Pear

ここで基本的に行ったことは、各項目ごとに分割labelsすることです。Table2次に、バイナリ左結合を実行しながら、各ラベルごとに一意のアイテムを集計しましたTable1


新しいものを編集Table2して、コードを次のように変更できます

res <- setDT(Table2)[, list(label = unlist(labels)), by = item]
Table1["item"] <- sapply(Table1$label, function(x) toString(unique(res[grepl(x, label), item])))
Table1
#    label         item
# 1    Tom        Apple
# 2  Gemma         Pear
# 3 Graham Orange, Pear
于 2015-06-04T20:01:36.013 に答える