2011-08-29 5 views
1
여기

은 예시 dataframe이다 : 할 싶은 것이데이터 프레임의 일치하는 그룹에서 데이터 집합을 식별하고 요약하려면 어떻게합니까?

set.seed(0) 
x1 <- c(1, 1, 1, 1, 1, 2, 2, 2, 2) 
x2 <- c(1, 1, 0, 0, 0, 1, 1, 1, 1) 
x3 <- c(1, 1, 2, 2, 4, 1, 1, 2, 1) 
n <- c(1, 1, 1, 5, 5, 1, 1, 1, 1) 
y <- rnorm(9) 

mydf <- data.frame(x1, x2, x3, n, y) 

  1. 함께 행을 식별이고 N = 1 (X1, X2, X3)
  2. 의 동일한 값을 공유 할 각 Y = 평균 (Y)과 서브 세트 및 N = 길이 (Y)
  3. 가 동일한 다른 행을 유지하는 하나의 행을 반환한다.

예를 들어, 새로운 dataframe는

x1 <- c(1,   1, 1, 1, 2,     2) 
x2 <- c(1,   0, 0, 0, 1,     1) 
x3 <- c(1,   2, 2, 4, 1,     2) 
n <- c(2,   1, 5, 5, 3,     1) 
y <- c(mean(y[1:2]), y[3], y[4], y[5], mean(y[c(6:7,9)]), y[8]) 

newdf <- data.frame(x1, x2, x3, n, y) 

내가 조건문과 루프로 이것을 알아낼 수있을 것입니다,하지만 난이 일을 더 우아한 방법을 학습하는 것을 선호합니다.

답변

4

"다른 열의 값은 동일합니다"라는 말은 각 하위 집합이 x1x2과 같지 않은 하위 집합의 각 행에 동일한 값인 x1으로 정의된다는 의미입니다. 예를 들어 당신이 의미 한 것을 보아 주셔서 감사합니다.

library("plyr") 

부품이 하나, 둘,

ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, n = length(y), y = mean(y)) 

이 어디 n!=1 당신이

rbind(
    ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, n = length(y), y = mean(y)), 
    mydf[mydf$n!=1,] 
) 

이것은이없는 말을 얻을 수 mydf의 부분 -ed rbind 수 있습니다 얻으려면 당신이 열거 한 것과 같은 순서. 이것이 정말로 중요하다면 몇 가지 보조 정렬 변수를 추가 할 수 있습니다. 매우 잘 작동

mydf$order = seq(length=nrow(mydf)) 
newdf <- rbind(
    ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, 
    n = length(y), y = mean(y), order=min(order)), 
    mydf[mydf$n!=1,] 
) 
newdf <- newdf[order(newdf$order),] 
newdf$order <- NULL 
+0

. 감사. 애매한 점에 대해 사과드립니다. – Abe

관련 문제