如何获取某些分组数据帧?

时间:2014-05-05 19:01:35

标签: r

我有一个可以通过以下示例近似的数据框:

z <- c(0,1,2,3,4,5,7,6,5,4,3,2,3,2) 
y <- c(2,2,2,2,3,3,3,4,4,4,4,5,5,5)
a <- c(1,1,1,2,2,2,2,6,6,6,6,7,7,7)
x <- data.frame(z,y,a)

我想要做的是提取按y列和a新数据框分组的每个组的每个第三行。 我只能提出拖动每组最后一行的代码。

df1<-ddply(df1, .(y,a), transform, nrow=nrow(z))
df1n<-array(0,c(0,3))
for (i in 1:nrow(x))
{
    df1n <- rbind(df1n, x[x[1,"nrow"],])
    x <- x[-(1:x[i-i+1,"nrow"]),]
    i=i+1
}

任何帮助都将不胜感激。

编辑:请将y视为:

y <- c(2,2,2,2,2,2,2,4,4,4,4,5,5,5)

4 个答案:

答案 0 :(得分:3)

这可能是by或许

的好用
do.call(rbind, by(x, list(x$y, x$a), function(z) z[3,]))

确保每个组至少有三行。 do.call(rbind, )部分只是将by创建的data.frames列表合并在一起。

答案 1 :(得分:2)

使用dplyr的另一种解决方案:

require(dplyr)
newdf <-
x %.%
  group_by(y,a) %.%
  summarize(z = z[3])

结果:

  y a z
1 2 1 2
2 2 2 5
3 4 6 4
4 5 7 2

在这种情况下,只有列的顺序不同

答案 2 :(得分:2)

library(data.table)
setDT(x)[, list(z = z[3]), by = c("y", "a")]

##    y a z
## 1: 2 1 2
## 2: 2 2 5
## 3: 4 6 4
## 4: 5 7 2

答案 3 :(得分:0)

我会使用以下内容:

 df <- x[seq(1, nrow(x), by=3),]

假设您想要第一行,然后是第四行,依此类推。它可以调整以适应其他要求。