2013-08-22 3 views
2

필자는 plyr을 처음 사용하고 여러 변수에 대한 데이터 프레임의 모양을 변경하기 위해 클래스 내에서 가중 평균을 취하려고합니다. 다음 코드를 사용하여, 나는 그런 X2로, 하나 개의 변수에 대해이 작업을 수행하는 방법을 알고 :ddply를 사용하여 데이터 프레임에 클래스의 가중 평균을 얻는 방법은 무엇입니까?

set.seed(123) 
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE), 
        x=rnorm(20), x2 = rnorm(20), weights=rnorm(20)) 
ddply(frame, .(class),function(x) data.frame(weighted.mean(x$x2, x$weights)))  

그러나, 나는 x와 X2를위한 새로운 데이터 프레임을 생성하는 코드 (변수의 양을 부탁합니다 프레임). 아무도 이것을하는 방법을 아는가? 감사합니다

+0

(? 당신은, 당신이 뭔가에 ddply''의 출력을 할당해야 알 오른쪽) – smci

답변

7

?summarise 함수에서 원하는 것을 찾을 수 있습니다.

library(plyr) 
set.seed(123) 
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE), x=rnorm(20), 
        x2 = rnorm(20), weights=rnorm(20)) 
ddply(frame, .(class), summarise, 
     x2 = weighted.mean(x2, weights)) 

이뿐만 아니라 x이 작업을 수행 다만 summarise 기능에 해당 행이 전달 될 추가하려면 :

ddply(frame, .(class), summarise, 
     x = weighted.mean(x, weights), 
     x2 = weighted.mean(x2, weights)) 

편집 다음과 같이 나는 summarise와 코드를 복제 할 수 있습니다 경우 여러 열에서 작업을 수행하려면 summarise 대신 colwise 또는 numcolwise을 사용하거나 reshape2 pac 인 melt 데이터 프레임에서 summarise을 수행하십시오. kage 다음 원래 양식으로 돌아 가기 cast. 줄 것이다 Here's an example.


:

wmean.vars <- c("x", "x2") 

ddply(frame, .(class), function(x) 
     colwise(weighted.mean, w = x$weights)(x[wmean.vars])) 

을 마지막으로 wmean.vars를 지정하는 것을 좋아하지 않는 경우에, 당신은 또한 할 수있는하십시오 가중을 계산합니다

ddply(frame, .(class), function(x) 
     numcolwise(weighted.mean, w = x$weights)(x[!colnames(x) %in% "weights"])) 

가중치를 제외한 모든 숫자 필드의 평균

+0

감사합니다,이 작동합니다. 각 새로운 변수마다 함수를 지정할 필요가 없도록 이렇게하는 방법이 있습니까? 100 개의 변수가있는 데이터 세트로 작업하고 있으므로 시간이 좀 걸립니다! –

+1

매우 간결한 설명을 작성해 주셔서 감사합니다. @ flodel. 아래의 @thelatemail에 이어'wmean.vars <- setdiff (names (frame), c ("class", "weights"))'를 사용하여'x'와'x2'를 지정하지 않아도됩니다. – Frank

+0

음,'numcolwise'에 대해 언급해 주셔서 감사합니다. 전에 본 적이 없었습니다. – flodel

3

data.table 재미있게 대답합니다. 모든 변수를 개별적으로 지정하지 않아도됩니다.

library(data.table) 
frame <- as.data.table(frame) 
keynames <- setdiff(names(frame),c("class","weights")) 
frame[, lapply(.SD,weighted.mean,w=weights), by=class, .SDcols=keynames] 

결과 :

class   x   x2 
1:  B 0.1390808 -1.7605032 
2:  D 1.3585759 -0.1493795 
3:  C -0.6502627 0.2530720 
4:  E 2.6657227 -3.7607866 
+0

'data.table'에 +1. '.SD'는'weights'에서 불필요합니다. (이론적으로'keynames'에 대한 해결 방법도 있어야합니다.)'frame [, lapply (.SD [, keynames, with = FALSE], weighted.mean , w = 가중치), by = class]'같은 결과가 나타납니다. – Frank

+0

@Frank - 그 덕분에 - 나는 당신의 제안을 편집했습니다. – thelatemail

관련 문제