2011-08-29 65 views
1

下面是一個例子數據幀:如何識別和彙總來自數據框中匹配組的數據集?

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 = mean(y)和n = length(y)
  3. 保持其他行相同。

例如,新的數據幀將

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

所謂「在其他列相同的值」,我想你意味着每個子集是由x1在每個子集的行的相同的值定義的,而不是x1等於x2。感謝這個例子,看看你的意思。

library("plyr") 

要獲得第一和第二部分

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

這可能是rbindmydf部分-ed哪裏n!=1讓你說什麼

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

這並不一定與您列出的訂單相同。如果這真的很重要,可以添加一些輔助排序變量。

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