我有一个数据框,长这样:
当然了,我总是能够获得最好的
df <- data.frame(x = c(0:20), y = c(50:70),
m = c(0, 0, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0 ,0 , -1, 0, 0, 1, 0, 0, -1, 0))
我想创建由'm'列中的一系列值定义的子集:
一个序列应该以m == -1
开始和结束,并且在起始和结尾-1
之间必须有一个1
。然后,每个子集都包括在开始和结束之间的所有行。
例如,上述数据中的一个子集将如下所示:
Subset1 <- data.frame(x = c(4:10), y = c(54:60), m = c(-1, 0, 0, 1, 0, 0, -1))
# x y m
# 1 4 54 -1 # starts with -1
# 2 5 55 0
# 3 6 56 0
# 4 7 57 1 # contains a 1
# 5 8 58 0
# 6 9 59 0
# 7 10 60 -1 # ends with -1
我一直在尝试,但是无法弄清如何做到。我尝试使用mapply
或for
循环,但当涉及到设置模式时,我总是卡住,因为模式的两端是相同的。
例如,使用mapply
,我已经完成了:
List_subsets <- mapply(function(i, j, z) df[i:j:z, , drop = FALSE], -1, 1, -1,
SIMPLIFY = FALSE)
当然了,我总是能够获得最好的
# error: In i:j:z : numerical expression has 3 elements: only the first used
你知道这是否可能,并且能帮我吗?我非常感激您的回答,因为我对R非常陌生,它对我来说非常具有挑战性。
非常感谢!
c(-1, 1, -1, 1, -1)
,那么假设第二个-1被以第一个-1开头的子集所“消耗”,那么我们只有一个组/子集,即第1-3行?或者它可以是两个共享“-1”的组,其中第1-3行是一组,第3-5行是另一组?您能否澄清一下。谢谢。 - Henrik