我正在尝试根据列中的特定值(而不是分组值)将数据帧拆分为多个块,因此,每当该列与该值匹配时,它都应该对数据帧进行分块。例如,使用数据框x:
f1 f2
3 0
4 1
5 2
6 0
7 1
8 2
9 3
我如何将x拆分为一个列表,何时“ f2” == 0就会发生拆分:
[1]
f1 f2
3 0
4 1
5 2
[2]
f1 f2
6 0
7 1
8 2
9 3
我尝试过
split(x, x$f2 == 0)
只会创建一个包含两个元素的列表,其中x x $ f2 == 0为FALSE,而其中x $ f2 == 0为TRUE。
我也曾尝试使用apply()
mm <- apply(x, function(x) split(x$f2 == 0))
但是出现错误“ match.fun(FUN)中的错误:缺少参数“ FUN”,没有默认值”
创建上述简单数据框的代码:
f1 <- c(3,4,5,6,7,8,9)
f2 <- c(0,1,2,0,1,2,3)
x <- data.frame(f1,f2)
答案 0 :(得分:4)
将基数R的split
与例如cumsum
这样使用将是一种方法:
split(x, cumsum(x$f2 == 0))
输出
# $`1`
# f1 f2
# 1 3 0
# 2 4 1
# 3 5 2
#
# $`2`
# f1 f2
# 4 6 0
# 5 7 1
# 6 8 2
# 7 9 3
答案 1 :(得分:1)
使用dplyr
,您可以执行(基本上与@jogo的想法相同):
df %>%
group_split(cumsum(f2 == 0), keep = FALSE)
[[1]]
# A tibble: 3 x 2
f1 f2
<int> <int>
1 3 0
2 4 1
3 5 2
[[2]]
# A tibble: 4 x 2
f1 f2
<int> <int>
1 6 0
2 7 1
3 8 2
4 9 3