【发布时间】:2014-11-25 16:49:23
【问题描述】:
这可能真的很简单,但我找不到解决方案:
df <- data.frame(replicate(10,sample(0:1,10,rep=TRUE)))
v <- c(3, 7)
有没有一种优雅的方法可以在 v 中指定的行号处将此数据框拆分为(列表的)三个元素?
【问题讨论】:
-
第 3 行和第 7 行应该去哪里?
这可能真的很简单,但我找不到解决方案:
df <- data.frame(replicate(10,sample(0:1,10,rep=TRUE)))
v <- c(3, 7)
有没有一种优雅的方法可以在 v 中指定的行号处将此数据框拆分为(列表的)三个元素?
【问题讨论】:
假设行 1&2 进入第一个拆分,3,4,5,6 进入第二个,7 to nrow(df) 进入最后一个
split(df, cumsum(1:nrow(df) %in% v))
但如果1:3 行在第一个拆分中,则出现4:7,然后在第三个8 to nrow(df)
split(df, cumsum(c(TRUE,(1:nrow(df) %in% v)[-nrow(df)])) )
或者正如 @James 在 cmets 中提到的那样,
split(df, cumsum(1:nrow(df) %in% (v+1)))
【讨论】:
(v+1) 可能更容易。
另一种方式:
split(df, findInterval(1:nrow(df), v))
对于替代解释,您可以使用:
split(df, cut(1:nrow(df), unique(c(1, v, nrow(df))), include.lowest=TRUE))
【讨论】: