2014-04-16 3 views
0

제목에 불편을 끼쳐 드려 죄송합니다. 나는 다음과 같은 dataframe 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 

내가 열이 다른에 다음과 같은 정보를 (DF1의 $의 ID 1의 값 중 일부는 DF2의 $의 ID2와 viceversa에 포함되어 있습니다)이 "DF2"가 데이터 세트 또는 첫 번째 것과 다른 길이. 내가 뭘하려고 오전

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

는 "ID1"는 CLA를 열 (즉, "NS")의에 ID2와 공통의 값 (즉, "NS")를 얼마나 많은 계산하는 것입니다.

그래서 나는이 시도 :

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]))} 
    } 
} 

내가 여기서 뭘하려고하는 ID1이 반복 될 때 나는 나중에 참조 할 수 있도록 모든 clas1, clas2 또는 clas3 포함 목록을 만들 때 clas0의 값이 목록의 어딘가에 포함되어 있습니까?

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

내가 끼 었어 : 그러나 나는 다음과 같은 경고가 계속. 누군가가 올바른 방향으로 나를 가리킬 수 있을까요? 많은 감사 마르코

+0

나는 확실히 당신이 뭘하려는 건지 이해하지 않지만, 오류가'경우에서 아마. 'if'가 벡터를 반환하지 않으면, 단일 T/F 값을 반환합니다. 당신은 'df $ id' 벡터를'Tf $ id'의 각 요소에 대해 T/F를 반환해야하는'i'와 비교할 때 하나의 T/F가 아닌'df $ id' 벡터를 비교하려고합니다. – TheComeOnMan

+0

출력이 어떻게 생겼는지 예를 들어 주시겠습니까? –

답변

1

내가 뭘하려고 오전 "ID1"는 CLA를 열 (즉, "NS")의에 ID2와 (즉, "NS")을 공통의 가치를 얼마나 많은 계산하는 것입니다 . `(== 내가 DF1의 $의 ID1)

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 
관련 문제