【发布时间】:2016-08-29 17:05:06
【问题描述】:
我正在尝试根据列 v3 中出现的特定序列对数据框进行子集化。
数据框示例:
v1 <- c(1:20)
v2 <- c(1,1,0,0,1,0,1,1,1,0,1,1,0,0,0,1,1,0,0,0)
v3 <- c(4,4,2,3,2,3,2,4,4,2,3,2,3,3,3,4,4,2,3,3)
my_df <- data.frame(v1,v2,v3) # creating a dataframe
my_df 的示例输出
v1 v2 v3
1 1 1 4
2 2 1 4
3 3 0 2
4 4 0 3
5 5 1 2
6 6 0 3
7 7 1 2
8 8 1 4
9 9 1 4
10 10 0 2
11 11 1 3
12 12 1 2
13 13 0 3
14 14 0 3
15 15 0 3
16 16 1 4
17 17 1 4
18 18 0 2
19 19 0 3
20 20 0 3
我想要实现的输出应该是这样的
1 1 1 4
2 2 1 4
3 3 0 2
8 8 1 4
9 9 1 4
10 10 0 2
16 16 1 4
17 17 1 4
18 18 0 2
所以我想根据4 4 2 列v3 中的序列对我的df 进行子集化。到目前为止我尝试的是:
my_df[which(c(diff(v3))==-2),]
但这只会提取序列4 4 2like的中间四个
v1 v2 v3
2 2 1 4
9 9 1 4
17 17 1 4
我尝试的另一个选项:
m = match(v3, c(4,4,2))
> m
[1] 1 1 3 NA 3 NA 3 1 1 3 NA 3 NA NA NA 1 1 3 NA NA
> my_df[!is.na(m),]
v1 v2 v3
1 1 1 4
2 2 1 4
3 3 0 2
5 5 1 2
7 7 1 2
8 8 1 4
9 9 1 4
10 10 0 2
12 12 1 2
16 16 1 4
17 17 1 4
18 18 0 2
这个输出给了我所有的 4 和 2,但不是我想要的序列 4 4 2。任何帮助,将不胜感激。
我已经在 matlab 中使用 for 和 if 循环实现了这一点,但我只是想知道如何在 R 中以无循环的方式解决这个问题。
【问题讨论】:
-
参见here 一个关于在数字向量中查找序列的类似问题。那里的所有答案都会输出一个匹配发生位置的索引向量(此处为
c(1, 8, 16)),您可以使用它来对您的my_df进行子集化。 IE。假设i = c(1, 8, 16),那么c(outer(0:2, i, "+"))给出所有索引