以下是一个示例数据框:
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)
我想做的是
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)
我可以用条件和循环来解决这个问题,但我更愿意学习更优雅的方法。
答案 0 :(得分:4)
通过“其他列中的相同值”,我认为你的意思是每个子集在子集的每一行中都由x1
的相同值定义,而不是x1
相等到x2
。感谢您举例说明您的意思。
library("plyr")
获得第一和第二部分
ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, n = length(y), y = mean(y))
这可以rbind
- 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