这是我的原始df:
my_df_1 <- data.frame(col_1 = c(rep('a',5), rep('b',5), rep('c', 5)),
col_2 = c(rep('x',3), rep('y', 9), rep('x', 3)))
我想按col_1
分组,如果给定组的col_2
包含x
,则返回1,否则返回0。
这是最终结果的外观:
my_df_2 <- data.frame(col_1 = c(rep('a',5), rep('b',5), rep('c', 5)),
col_2 = c(rep('x',3), rep('y', 9), rep('x', 3)),
col_3 = c(rep(1,5), rep(0,5), rep(1, 5)))
如果可能的话,我希望用dplyr
完成它。这是count if
谓词,但找不到。
答案 0 :(得分:2)
这是一种实现方法,如果您的col_2
包含x
和其他字符/数字(例如xa
,x7
,或类似):
library(dplyr)
my_df_1 %>%
group_by(col_1) %>%
mutate(col_3 = ifelse(any(grepl("x", col_2)), 1, 0))
输出:
# A tibble: 15 x 3
# Groups: col_1 [3]
col_1 col_2 col_3
<fct> <fct> <dbl>
1 a x 1
2 a x 1
3 a x 1
4 a y 1
5 a y 1
6 b y 0
7 b y 0
8 b y 0
9 b y 0
10 b y 0
11 c y 1
12 c y 1
13 c x 1
14 c x 1
15 c x 1
答案 1 :(得分:2)
当我们寻找'col_1'的每个唯一元素是否存在'x'%in%
'col2'时,按'col_1'分组后,得到长度为1的逻辑矢量,{{1 }}(通过在%in%的lh上放置“ x”),然后使用%in%
as.integer
如果'x'仅是部分匹配项,请使用library(dplyr)
my_df_1 %>%
group_by(col_1) %>%
mutate(col_3 = as.integer("x" %in% col_2))
# A tibble: 15 x 3
# Groups: col_1 [3]
# col_1 col_2 col_3
# <fct> <fct> <int>
# 1 a x 1
# 2 a x 1
# 3 a x 1
# 4 a y 1
# 5 a y 1
# 6 b y 0
# 7 b y 0
# 8 b y 0
# 9 b y 0
#10 b y 0
#11 c y 1
#12 c y 1
#13 c x 1
#14 c x 1
#15 c x 1
str_detect