R 按分隔符中的分隔符行拆分数据帧

R 按分隔符中的分隔符行拆分数据帧,r,dataframe,split,R,Dataframe,Split,我有一个数据框,看起来像: X1 X2 X3 1 ### <NA> <NA> 2 aa bb cc 3 dd ee ff 4 ### <NA> <NA> 5 a1 a2 a3 6 b1 b2 b3 7 g3 h3 k5 8 ### <NA> <NA> 9 k1 k2 k3 谢谢 生成示例df的代码如下: df=data.frame(rbind(c("

我有一个数据框,看起来像:

   X1   X2   X3
1 ### <NA> <NA>
2  aa   bb   cc
3  dd   ee   ff
4 ### <NA> <NA>
5  a1   a2   a3
6  b1   b2   b3
7  g3   h3   k5
8 ### <NA> <NA>
9  k1   k2   k3
谢谢

生成示例df的代码如下:

df=data.frame(rbind(c("###",NA,NA),c("aa","bb","cc"),c("dd","ee","ff"),c("###",NA,NA),c("a1","a2","a3"),c("b1","b2","b3"),c("g3","h3","k5"),c("###",NA,NA),c("k1","k2","k3")))
这可能会起作用:

from <- which(df[,"X1"]=="###")+1
to <- c(tail(from,-1)-2, nrow(df))
mapply(function(a,b) df[a:b,], from, to, SIMPLIFY=FALSE)

from在使用逻辑
vector
创建分组变量后,我们可以使用
split

i1 <- df$X1 == "###"
split(df[!i1,], cumsum(i1)[!i1])

i1使用
g
对行进行分组,第一个数据帧中的行为1,第二个数据帧中的行为2,依此类推。然后按
g
拆分,并删除每个组件中的第一行

g <- cumsum(df$X1 == "###")
lapply(split(df, g), tail, -1)
或者,最后一行代码可以替换为(生成
by
列表):


回答得很好,阿克伦!
g <- cumsum(df$X1 == "###")
lapply(split(df, g), tail, -1)
$`1`
  X1 X2 X3
2 aa bb cc
3 dd ee ff

$`2`
  X1 X2 X3
5 a1 a2 a3
6 b1 b2 b3
7 g3 h3 k5

$`3`
  X1 X2 X3
9 k1 k2 k3
by(df, g, tail, -1)