2017-07-10 11 views
3

Iは2次の表があるとしますチェック

表1:

id word 
1  apple 
1  banana 
2  cherry 
2  donuts 
3  eggplant 
3  fish 

表2(key_words):

key_words 
apple 
orange 
cherry 
peach 

I table1の 'word'列の各要素がtable2に存在するかどうかを確認し、次のような結果が得られるかどうかを確認します。

id apple orange cherry peach 
1  1  0  0  0 
2  0  0  1  0 
3  0  0  0  0 

たとえば、
1は最初の行にあり、「apple」列はID 1にリンゴが付いていることを示します。
2行目に0、「オレンジ」の列はid2にオレンジが付いていないことを意味します。

、このような結果を得るために、私はループのために書いた:

data=list() 
data[[1]]=table1$id 
l=dim(table1)[1] 
for(i in 2:(length(key_words)+1)){ 
    exist=c() 
    for(j in 1:l){ 
    d1=table1[which(table1$id==data[[1]][j]),] 
    if(key_words[i] %in% d1$word){ 
     exist[j]=1 
    } else { 
     exist[j]=0 
    } 
    } 
    data[[i]]=exist 
} 
data=as.data.frame(data) 
names(data)=c("id","apple","orange","cherry","peach") 

それは作業を行います。

しかし、私のテーブルサイズとキーワード数がはるかに大きくなると、たとえば、10,000のIDと1,000のキーワードがある場合、forループは非常に長い時間実行されます。

実行時間を短縮する方法がいくつかありますか?

答えて

2
library(data.table) 

dat <- fread("id word 
1  apple 
      1  banana 
      2  cherry 
      2  donuts 
      3  eggplant 
      3  fish") 


dat_key <- fread("key_words 
apple 
orange 
cherry 
peach") 

dat_wide <- data.table(ID = unique(dat$id)) 
l <- lapply(dat_key$key_words, function(x) dat_wide[, (x) := ifelse(ID %in% dat[word == x]$id, 1, 0)][]) 

dat_wide 

    ID apple orange cherry peach 
1: 1  1  0  0  0 
2: 2  0  0  1  0 
3: 3  0  0  0  0 
+2

key_wordsは主データセットにあります。つまり、あなたの答えから離れています。 (私のひどいDT試行:dat [、lapply(key_words、 "%in%"、word)、by = id]) – user20650

+2

ありがとう、私は間違って読むと思う。正しい出力が得られるように更新されました。 –

1
data.frame(t(sapply(split(table1, table1$id), function(a) 
    colSums(sapply(table2$key_words, function(x) a$word %in% x)) > 0))) 
# apple orange cherry peach 
#1 TRUE FALSE FALSE FALSE 
#2 FALSE FALSE TRUE FALSE 
#3 FALSE FALSE FALSE FALSE 

DATA

temp = data.frame(t(sapply(split(table1, table1$id), function(a) 
    colSums(sapply(table2$key_words, function(x) a$word %in% x)) > 0))) 
data.frame(sapply(temp, as.numeric), row.names = row.names(temp)) 
# apple orange cherry peach 
#1  1  0  0  0 
#2  0  0  1  0 
#3  0  0  0  0 

必要に応じてブールは別のステップで数値に変更することができ Qの私の読書は、それはそれをテストすることであるということである

table1 = structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L), word = c("apple", 
"banana", "cherry", "donuts", "eggplant", "fish")), .Names = c("id", 
"word"), class = "data.frame", row.names = c(NA, -6L)) 

table2 = structure(list(key_words = c("apple", "orange", "cherry", "peach" 
)), .Names = "key_words", class = "data.frame", row.names = c(NA, 
-4L)) 
+1

素敵な仕事!ありがとう! – Leonard