我有一个可以通过以下示例近似的数据框:
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)
答案 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),]
假设您想要第一行,然后是第四行,依此类推。它可以调整以适应其他要求。