R 拆分 data.frame 使用表示和 on/off 开关的列
R Split data.frame using a column that represents and on/off switch
我的数据如下所示:
a <- data.frame(cbind(x=seq(50),
y=rnorm(50),
z=c(rep(0,5),
rep(1,8),
rep(0,3),
rep(1,2),
rep(0,12),
rep(1,12),
rep(0,8))))
我想拆分列 z
上的 data.frame a
,但将每个组作为单独的 data.frame
作为列表的成员,即在我的列表中例如,前 5 行将是列表中的第一个项目,接下来的 8 行将是列表中的下一个项目,接下来的 3 行将是该项目之后的项目,等等
简单因数将所有 1 和所有 0 组合在一起...
我确信有一种简单的方法可以做到这一点,但目前还没有实现。
谢谢
尝试 data.table
v > 1.9.5
中的 rleid
函数
library(data.table)
split(a, rleid(a$z))
# $`1`
# x y z
# 1 1 -0.03737561 0
# 2 2 -0.48663043 0
# 3 3 -0.98518106 0
# 4 4 0.09014355 0
# 5 5 -0.07703517 0
#
# $`2`
# x y z
# 6 6 0.3884339 1
# 7 7 1.5962833 1
# 8 8 -1.3750668 1
# 9 9 0.7987056 1
# 10 10 0.3483114 1
# 11 11 -0.1777759 1
# 12 12 1.1239553 1
# 13 13 0.4841117 1
....
这里有一些 base R
选项。
使用rle
。 @Spacedman
评论中 rleid
函数的变体
split(a,inverse.rle(within.list(rle(a$z), values <- seq_along(values))))
根据相邻元素是否相等创建逻辑索引后使用cumsum
split(a, cumsum(c(TRUE, a$z[-1]!=a$z[-nrow(a)])))
或者,也可以 cumsum
:
split(a, c(0, cumsum(diff(a$z) != 0)))
我的数据如下所示:
a <- data.frame(cbind(x=seq(50),
y=rnorm(50),
z=c(rep(0,5),
rep(1,8),
rep(0,3),
rep(1,2),
rep(0,12),
rep(1,12),
rep(0,8))))
我想拆分列 z
上的 data.frame a
,但将每个组作为单独的 data.frame
作为列表的成员,即在我的列表中例如,前 5 行将是列表中的第一个项目,接下来的 8 行将是列表中的下一个项目,接下来的 3 行将是该项目之后的项目,等等
简单因数将所有 1 和所有 0 组合在一起...
我确信有一种简单的方法可以做到这一点,但目前还没有实现。
谢谢
尝试 data.table
v > 1.9.5
rleid
函数
library(data.table)
split(a, rleid(a$z))
# $`1`
# x y z
# 1 1 -0.03737561 0
# 2 2 -0.48663043 0
# 3 3 -0.98518106 0
# 4 4 0.09014355 0
# 5 5 -0.07703517 0
#
# $`2`
# x y z
# 6 6 0.3884339 1
# 7 7 1.5962833 1
# 8 8 -1.3750668 1
# 9 9 0.7987056 1
# 10 10 0.3483114 1
# 11 11 -0.1777759 1
# 12 12 1.1239553 1
# 13 13 0.4841117 1
....
这里有一些 base R
选项。
使用
评论中rle
。 @Spacedmanrleid
函数的变体split(a,inverse.rle(within.list(rle(a$z), values <- seq_along(values))))
根据相邻元素是否相等创建逻辑索引后使用
cumsum
split(a, cumsum(c(TRUE, a$z[-1]!=a$z[-nrow(a)])))
或者,也可以 cumsum
:
split(a, c(0, cumsum(diff(a$z) != 0)))