R:尝试在mutate中使用'match'进行分组tbl时出现问题

时间:2016-11-28 14:55:37

标签: r match dplyr

我有一个带有id列和布尔事件列的数据框:

x <- data.frame(id = c(0,0,0,1,1,1,2,2,2,2,3,3,3), 
             event = c(F,F,F,T,F,F,F,T,F,F,F,T,T))

对于每个id,我想在其旁边创建一个列,其中事件的位置为TRUE。因此,对于id 0,没有TRUE因此我得到NA,而对于id 1,第一个元素是TRUE所以我得到1,因为id 2我得到2id 3我得2

预期产出:

      id event event_num
   (dbl) (lgl)     (int)
1      0 FALSE        NA
2      0 FALSE        NA
3      0 FALSE        NA
4      1  TRUE         1
5      1 FALSE         1
6      1 FALSE         1
7      2 FALSE         2
8      2  TRUE         2
9      2 FALSE         2
10     2 FALSE         2
11     3 FALSE         2
12     3  TRUE         2
13     3  TRUE         2

为了尝试解决这个问题,我使用了代码:

x %>% group_by(id) %>% mutate(event_num = match(TRUE, event))

然而这给了我

     id event event_num
   (dbl) (lgl)     (int)
1      0 FALSE        NA
2      0 FALSE        NA
3      0 FALSE        NA
4      1  TRUE         1
5      1 FALSE         1
6      1 FALSE         1
7      2 FALSE        NA
8      2  TRUE        NA
9      2 FALSE        NA
10     2 FALSE        NA
11     3 FALSE         2
12     3  TRUE         2
13     3  TRUE         2

即。 id 2有NA而不是2

修改 将dplyr更新为0.5.0并且工作正常,之前使用的是0.4.3

2 个答案:

答案 0 :(得分:3)

我们可以使用autoLayout并选择第一个外观:

which

我们也可以使用library(dplyr) x %>% group_by(id) %>% mutate(event_num = which(event)[1]) # Source: local data frame [13 x 3] # Groups: id [4] # # id event event_num # <dbl> <lgl> <int> # 1 0 FALSE NA # 2 0 FALSE NA # 3 0 FALSE NA # 4 1 TRUE 1 # 5 1 FALSE 1 # 6 1 FALSE 1 # 7 2 FALSE 2 # 8 2 TRUE 2 # 9 2 FALSE 2 # 10 2 FALSE 2 # 11 3 FALSE 2 # 12 3 TRUE 2 # 13 3 TRUE 2 。但我通常会避免将布尔元素与向量匹配。

答案 1 :(得分:-1)

我们也可以使用which.max

x %>% 
   group_by(id) %>% 
   mutate(event_num = which.max(event)*NA^all(!event))
   id event event_num
#    <dbl> <lgl>     <dbl>
#1      0 FALSE        NA
#2      0 FALSE        NA
#3      0 FALSE        NA
#4      1  TRUE         1
#5      1 FALSE         1
#6      1 FALSE         1
#7      2 FALSE         2
#8      2  TRUE         2
#9      2 FALSE         2
#10     2 FALSE         2
#11     3 FALSE         2
#12     3  TRUE         2
#13     3  TRUE         2