2014-11-28 3 views
0

의 이름의 벡터를 통해 다른 컬럼의 합계를 집계 I 다음 data.frame 있습니다는 data.frame

> DF <- data.frame(names = I(list(c("a", "b", "c"), c("a"), c("c", "d"))), 
        counts = c(1, 2, 3)) 
> DF 
    names counts 
1 a, b, c  1 
2  a  2 
3 c, d  3 

가 어떻게 각 이름의 총 수를 요약 결과를 얻을 수 있습니까를? 같은 뭔가 :

name sum 
a  3 
b  1 
c  4 
d  3 

답변

1

시도

DF1 <- data.frame(name=unlist(DF$names), 
      val=rep(DF$counts,sapply(DF$names, length))) 

또는

DF1 <- do.call(rbind,Map(data.frame, name=DF$names, val=DF$counts)) 

aggregate(val~name, DF1, sum) 
# name val 
#1 a 3 
#2 b 1 
#3 c 4 
#4 d 3 

또는

DF2 <- transform(stack(setNames(DF$names, DF$counts)), 
           ind=as.numeric(as.character(ind))) 
    aggregate(ind~values, DF2, sum) 
+0

위에서 보여주는 세 가지 방법 각각에 대한 선호/이점이 있습니까? 첫 번째 방법은 초등/명백하고 이해하기 쉽지만 두 번째 방법은 깔끔하게 보입니다. 세 번째는 다소 불분명 한 것처럼 보입니다. – fnl

+0

@fnl이 모든 함수는'base R'에 기초합니다. 스택 (stack) 접근법. 'setNames'를 사용하여'list' 즉'DF $ names'를 명명하고'stack'을 적용하면'key/value' 쌍을 긴 형태로 리턴하지만'ind' 열은'factor . 그래서 저는 이것을'numeric'으로 변환 한 다음'aggregate'를 사용하여 합계를 얻었습니다. – akrun

+0

좋습니다, 감사합니다! 한 점, 어쩌면 : 나는 10k 복제를했고 성능을 측정했습니다. 첫 번째 버전은 2.792 초, 두 번째 버전은 8.591, 마지막 버전은 5.541 초 (10k 복제본 사용)입니다. 그런 다음 실제 데이터 (155k/98k 비 고유 이름)로이 작업을 수행하면이 관계가 성립합니다. 그래서 가장 애매한 방법이 가장 빠릅니다. 마지막 하나에 대한 설명 주셔서 감사합니다, 항상 새로운 것을 배울 수 있습니다! – fnl