2017-04-04 3 views
1

두 열의 상대적 겹침을 계산하는 빠른 방법을 아는 사람은 누구입니까? 'a'의 요소가 'b'에 얼마나 많은지 알고 싶습니다. 이상적으로 각 열에 대해 이러한 비교 값을 저장하는 열 'c'가 생성됩니다. 정말문자 데이터에 대한 연산 설정 (정수 문자열)

b <- c("20", "1, 8, 19, 20, 22, 23, 28, 34, 41", 
     "3, 8, 10, 11, 18, 20, 26, 37", 
     "1, 3, 6, 18, 21, 35", "NA", "1, 21, 33", "14, 37", 
     "4, 14, 18, 23, 33, 37, 40", "14", 
     "4, 14, 20, 23, 33, 37, 40", 
     "2, 3, 5, 7, 8, 10, 14, 16, 18, 23, 25, 34, 40", 
     "6, 8, 10, 14, 19, 29, 33, 35, 36, 39, 41", 
     "1, 20", "1, 28, 36", "14", 
     "1, 6, 33, 12, 39", "28", 
     "1, 6, 11, 13, 18, 19, 21, 28, 33, 35, 36, 39", 
     "35, 40", "20", "20, 38", "6, 8, 19, 22, 29, 32, 33, 34, 40", 
     "1, 10, 21, 25, 33, 35, 36, 39, 40", "36") 

a <- c("14", "10", "8, 39", "26, 39", "14, 20", "33, 36", "14", 
     "NA", "8, 39", "33, 36", "8, 39", "1, 36", "10", "28, 33", 
     "14, 20", "33, 40", "28, 34", "1, 36", 
     "8, 39", "20", "14, 20", "29, 33", "36", "14") 

df <- data.frame(a, b) 

df$a <- as.character(df$a) 
df$b <- as.character(df$b) 

이 기능은 행 (18) 잘 작동하지만, 쉽게 sapply 또는 동등한 확장되지 않습니다 ..이 하나 붙어. as.numeric와 변환이 필요한 이유

length(intersect(as.numeric(unlist(strsplit(df$a[18], ", "))),   
       as.numeric(unlist(strsplit(df$b[18], ", ")))))/
length(as.numeric(unlist(strsplit(df$b[18], ", ")))) 
# gives 
[1] 0.1666667 

length(intersect(as.numeric(unlist(strsplit(df$a[5], ", "))), 
       as.numeric(unlist(strsplit(df$b[5], ", ")))))/
length(as.numeric(unlist(strsplit(df$b[5], ", ")))) 
# gives 
[1] 0 
Warning messages: 
1: In intersect(as.numeric(unlist(strsplit(df$a[5], ", "))), as.numeric(unlist(strsplit(df$b[5], : 
    NAs introduced by coercion 
2: NAs introduced by coercion 

답변

1

나는 볼 수 없습니다. 그것이 당신에게 경고를주는 것입니다. "NA"는 데이터 프레임의 문자 값으로 간주되며 숫자로 변환 할 수없는 문자 값입니다.

경고는 오류가 아니므로 코드가 실제로 5 행에서도 작동한다는 것을 유의하십시오 (NA를 예상하지 않는 한).

나는 다음을 수행 할 것 :

getCounts <- function(x,y){ 
    x <- strsplit(x,", ")[[1]] 
    y <- strsplit(y,", ")[[1]] 
    mean(y %in% x) 
} 
# gives 
> getCounts(df$a[5],df$b[5]) 
[1] 0 

이것은 당신이했지만 더 명확하고 mean(..%in%..) 대신 length(intersect(..,..))/...를 사용하여 비트를 작성 무엇을 본질적으로. 벡터 A와 B 모두를 통해이 작업을 수행하기 위해

, 당신은 mapply 사용할 수 있습니다

out <- mapply(getCounts,df$a, df$b)