范围围绕数据框R dplyr中的值

时间:2014-08-20 22:36:14

标签: r dataframe range dplyr

我的数据框看起来像这样:

test <- data.frame(chunk = c(rep("a",27),rep("b",27)), x = c(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1))

我希望使用group_by()中的dplyr对数据进行分组,在此示例中称为chunk

我想在名为test的每个x1块中添加另一列,以便生成的数据框如下所示:

test1 <- data.frame(test, x1 = c(0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0))

x1标识x中所有出现的0,并且从结束0开始在每个方向上取+ -5行并添加标识符。标识符的含义无关紧要,但在此示例中,x1中的标识符对于范围为1,对于x中出现的0为2

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

以下是dplyr中的选项:

更短的版本:

n <- 1:5
test %>%
  group_by(chunk) %>%  
  mutate(x1 = ifelse((row_number() - min(which(x == 0))) %in% -n |
       (row_number(chunk) - max(which(x == 0))) %in% n, 1, ifelse(x == 0, 2, 0))) 

更长(第一)版本:

test %>%
  group_by(chunk) %>%
  mutate(start = (row_number() - min(which(x == 0))) %in% -5:-1,
         end = (row_number() - max(which(x == 0))) %in% 1:5,
         x1 = ifelse(start | end, 1, ifelse(x == 0, 2, 0))) %>%
  select(-c(start, end))

Source: local data frame [54 x 3]
Groups: chunk

   chunk x x1
1      a 1  0
2      a 1  0
3      a 1  0
4      a 1  0
5      a 1  0
6      a 1  0
7      a 1  0
8      a 1  1
9      a 1  1
10     a 1  1
11     a 1  1
12     a 1  1
13     a 0  2
14     a 0  2
15     a 0  2
16     a 0  2
17     a 1  1
18     a 1  1
19     a 1  1
20     a 1  1
21     a 1  1
22     a 1  0
23     a 1  0
24     a 1  0
25     a 1  0
26     a 1  0
27     a 1  0
28     b 1  0
29     b 1  0
30     b 1  0
31     b 1  0
32     b 1  0
33     b 1  0
34     b 1  0
35     b 1  1
36     b 1  1
37     b 1  1
38     b 1  1
39     b 1  1
40     b 0  2
41     b 0  2
42     b 0  2
43     b 0  2
44     b 1  1
45     b 1  1
46     b 1  1
47     b 1  1
48     b 1  1
49     b 1  0
50     b 1  0
51     b 1  0
52     b 1  0
53     b 1  0
54     b 1  0

这种方法的假设是,在每组&#34; chunk&#34;只有一个0的序列(如样本数据中所示)。如果您的实际数据不是这样,请告诉我。