2014-04-16 67 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