【问题标题】:How can I identify and summarize sets of data from matching groups in a dataframe?如何识别和汇总数据框中匹配组的数据集?
【发布时间】:2011-08-30 12:33:31
【问题描述】:

这是一个示例数据框:

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)

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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    通过“其他列中的相同值”,我认为您的意思是每个子集由子集的每一行中的 x1 的相同值定义,而不是 x1 等于 x2 .感谢您提供示例以了解您的意思。

    library("plyr")
    

    获取第一和第二部分

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

    这可以是rbind-ed 与mydf 的一部分,其中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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2011-12-05
      相关资源
      最近更新 更多