我有一个带有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
我得到2
,id 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
答案 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