繁体   English   中英

如何识别和汇总数据框中匹配组的数据集?

[英]How can I identify and summarize sets of data from matching groups in a 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 = 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)

我可以用条件和循环来解决这个问题,但我更愿意学习更优雅的方法来做到这一点。

通过“其他列中的相同值”,我认为你的意思是每个子集在子集的每一行中由相同的x1值定义,而不是x1等于x2 感谢您举例说明您的意思。

library("plyr")

获得第一和第二部分

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

这可以用mydf的部分进行rbind -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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM