R 使用特定元素作为分隔符拆分向量

R 使用特定元素作为分隔符拆分向量,r,vector,R,Vector,例如,在下面的向量中,我想使用零元素作为分隔符 x <- c(12, 1, 2, 15, 18, 0, 15, 13, 14, 9, 1, 0, 22, 9, 14, 3, 9, 20) 您将如何在R中执行此操作?例如: splt <- cumsum(x == 0) splt[x == 0] <- NA split(x, splt) # $`0` # [1] 12 1 2 15 18 # $`1` # [1] 15 13 14 9 1 # $`2` # [1] 2

例如,在下面的向量中,我想使用零元素作为分隔符

x <- c(12, 1, 2, 15, 18, 0, 15, 13, 14, 9, 1, 0, 22, 9, 14, 3, 9, 20)
您将如何在R中执行此操作?

例如:

splt <- cumsum(x == 0)
splt[x == 0] <- NA
split(x, splt)
# $`0`
# [1] 12  1  2 15 18

# $`1`
# [1] 15 13 14  9  1

# $`2`
# [1] 22  9 14  3  9 20
splt例如:

splt <- cumsum(x == 0)
splt[x == 0] <- NA
split(x, splt)
# $`0`
# [1] 12  1  2 15 18

# $`1`
# [1] 15 13 14  9  1

# $`2`
# [1] 22  9 14  3  9 20
splt您可以这样做

x <- c(12, 1, 2, 15, 18, 0, 15, 13, 14, 9, 1, 0, 22, 9, 14, 3, 9, 20)
lapply(strsplit(paste(x, collapse = ";"), "^0;|;0$|;0;"), function(y) {strsplit(y, ";")})[[1]]
# [[1]]
# [1] "12" "1"  "2"  "15" "18"

# [[2]]
# [1] "15" "13" "14" "9"  "1" 

# [[3]]
# [1] "22" "9"  "14" "3"  "9"  "20"
x你可以这样做

x <- c(12, 1, 2, 15, 18, 0, 15, 13, 14, 9, 1, 0, 22, 9, 14, 3, 9, 20)
lapply(strsplit(paste(x, collapse = ";"), "^0;|;0$|;0;"), function(y) {strsplit(y, ";")})[[1]]
# [[1]]
# [1] "12" "1"  "2"  "15" "18"

# [[2]]
# [1] "15" "13" "14" "9"  "1" 

# [[3]]
# [1] "22" "9"  "14" "3"  "9"  "20"

x另一个选项是使用
library(data.table)
中的
rleid
创建分组变量,然后
split
与分组变量不为0(
x[!!x]
)的“x”值

library(data.table)
split(x[!!x], rleid(!x)[!!x])

另一个选项是使用
library(data.table)
中的
rleid
创建分组变量,然后
split
与分组变量不为0(
x[!!x]
)的“x”值

library(data.table)
split(x[!!x], rleid(!x)[!!x])

这可能很好地解决了问题,但也请提供一个解释。许多新用户来到SO,对您的代码进行解释有助于他们学习如何调整代码以解决问题。@JenB或新用户加载
数据。表格
,并读取
?rleid
?!“
?拆分
。这也是一个很好的学习方式。我没有“瞄准”任何东西,也没有投反对票。您的帖子自动转到低质量的审阅队列,因为它只是代码。尽管您是一个高代表性用户,但我还是对该审查队列中的代码专用答案发表了标准评论(我并没有看到其他答案),因为我认为仅对低代表性用户发表这样的评论是不公平的。现在答案好多了。我把这个有趣的解决方案投了赞成票。我的回答也可以被认为是“仅代码”。这很可能解决问题,但也请提供解释。许多新用户来到SO,对您的代码进行解释有助于他们学习如何调整代码以解决问题。@JenB或新用户加载
数据。表格
,并读取
?rleid
?!“
?拆分
。这也是一个很好的学习方式。我没有“瞄准”任何东西,也没有投反对票。您的帖子自动转到低质量的审阅队列,因为它只是代码。尽管您是一个高代表性用户,但我还是对该审查队列中的代码专用答案发表了标准评论(我并没有看到其他答案),因为我认为仅对低代表性用户发表这样的评论是不公平的。现在答案好多了。我把这个有趣的解决方案投了赞成票。我的回答也可以被认为是“仅限代码”。