2014-04-16 109 views
0

對不起,希望它不太誤導。 我有以下數據幀DF1:匹配列和列表

id1  clas1 clas2 clas3 
512  ns  abx  NA 
512  ns  or  NA 
512  abx  dm  sup 
845  or  NA  NA 
1265 dd  ivf  NA 
1265 ns  ivf  pts 
9453 col  ns  ivf 
9453 abx  ns  or  
95635 ns  abx  or 

然後,我有「DF2」具有以下信息(一些在DF1 $ ID1的值被包括在DF2 $ ID2,反之亦然),它是一個列在另一數據集或第一個不同的長度。

id2  clas0 
102  ns 
512  ns 
915  ns 
1265  ns 
9453  ns 
10485 ns 
95639 ns 
100348 ns 

我所試圖做的是要算多少「ID1」具有在任何CLAS列(即「NS」)的共同價值(即「NS」)與ID2。

所以我已經試過這樣:

x<-as.numeric(levels(factor(df2$id2))) 
clas<-ls() 
for(i in 1:x){ 
    for(j in 1:length(df1$id1)){ 
    if(df1$id1==i){clas[[i]]=append(clas[[i]],c(df1$clas1[j],df1$clas2[j],df1$clas3[j]))} 
    } 
} 

我想在這裏做的是建立包括所有clas1,clas2或clas3列表時反覆ID1,這樣我可以再後來看到當clas0中的值是否包含在列表中的某個位置? 但我總是收到以下警告:

In if (id1$id1 == i) { ... : 
the condition has length > 1 and only the first element will be used 

我被卡住了。有人能指出我正確的方向嗎? 非常感謝 馬爾科

+0

我不太明白你想要做什麼,但錯誤可能是從'如果(DF1 $ ID1 == I)'。 'if'不返回一個向量,它返回一個T/F值。你試圖讓它比較整個'df $ id'向量與'i',它應該爲'df $ id'的每個元素返回T/F,而不僅僅是單個T/F。 – TheComeOnMan

+0

您能舉一個例子說明您如何期望輸出看起來像 –

回答

1

我所試圖做的是要算多少「ID1」在任何CLAS列(即「NS」)都有一個共同的價值與ID2 (即「NS」) 。

df1 <- read.table(text="id1  clas1 clas2 clas3 
512  ns  abx  NA 
512  ns  or  NA 
512  abx  dm  sup 
845  or  NA  NA 
1265 dd  ivf  NA 
1265 ns  ivf  pts 
9453 col  ns  ivf 
9453 abx  ns  or  
95635 ns  abx  or", header=TRUE) 

df2 <- read.table(text=" id2  clas0 
102  ns 
512  ns 
915  ns 
1265  ns 
9453  ns 
10485 ns 
95639 ns 
100348 ns", header=TRUE) 

df <- merge(df1, df2, by.x="id1", by.y="id2") 
sum(apply(df$clas0 == df[, c("clas1", "clas2", "clas3")], 1, any, na.rm = TRUE)) 
#[1] 5