R 用数值向量对数据帧进行子集划分
我有一个358行的数据帧R 用数值向量对数据帧进行子集划分,r,R,我有一个358行的数据帧 df <- data.frame(A=rnorm(358),B=rnorm(358)) df如果您喜欢原始循环解决方案,您可以简单地迭代所需的行号,我知道您对按行号对该数据帧进行子集设置感兴趣 set.seed(1) df <- data.frame(A=rnorm(358),B=rnorm(358)) ## Added 1 breaks <- c(1, 59,119,178,238,298, 358) listDFs <- vector
df <- data.frame(A=rnorm(358),B=rnorm(358))
df如果您喜欢原始循环解决方案,您可以简单地迭代所需的行号,我知道您对按行号对该数据帧进行子集设置感兴趣
set.seed(1)
df <- data.frame(A=rnorm(358),B=rnorm(358))
## Added 1
breaks <- c(1, 59,119,178,238,298, 358)
listDFs <- vector("list", length(breaks) - 1)
for (i in 1:(length(breaks)-1)) {
# Take observations from this to that row
listDFs[[i]] <- df[breaks[i]:breaks[i+1],]
}
如果您正在寻找一种在生成的对象上执行更多操作的直观方便的方法,则循环是有意义的
结果
n=c(59,60,59,60,60,60);拆分(df,rep(seq_-along(n),n))
?为什么这不是一个答案?我更喜欢Frank的解决方案,因为在我的单一情况下更容易使用。不过,我很感谢你的想法和帮助。@nouse没问题,很高兴我能做出贡献。如果您愿意,您可以尝试编写变体代码并探索实际数据的性能差异。这不仅仅是“调整”的问题listDFs[[1]][59,1]
不应等于listDFs[[2]][1,1]
,但在您的示例中,这是因为您的循环构造不正确。如果在中断的开始处添加0而不是1,并提取(中断[i]+1]:中断[i+1]
,它应该可以工作。循环一就是一个废话,每个子集df的最后一行是下一个df的第一行。。。没有因为包含正确答案而投反对票,但也没有投反对票。(当您的结果部分证明它不符合OP预期时,只需添加sapply结果的第一行,即可获得比初始数据集更多的行)
set.seed(1)
df <- data.frame(A=rnorm(358),B=rnorm(358))
## Added 1
breaks <- c(1, 59,119,178,238,298, 358)
listDFs <- vector("list", length(breaks) - 1)
for (i in 1:(length(breaks)-1)) {
# Take observations from this to that row
listDFs[[i]] <- df[breaks[i]:breaks[i+1],]
}
n = c(59, 60, 59, 60, 60, 60); split(df, rep(seq_along(n), n))
> sapply(listDFs, dim)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 59 61 60 61 61 61
[2,] 2 2 2 2 2 2