当出现特定的列值(R)时,如何将数据帧拆分为多个块?

时间:2019-06-04 07:58:57

标签: r

我正在尝试根据列中的特定值(而不是分组值)将数据帧拆分为多个块,因此,每当该列与该值匹配时,它都应该对数据帧进行分块。例如,使用数据框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)

2 个答案:

答案 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