按一列分组,然后检查R中另一列的值

时间:2019-02-06 16:17:30

标签: r group-by dplyr countif

这是我的原始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谓词,但找不到。

2 个答案:

答案 0 :(得分:2)

这是一种实现方法,如果您的col_2包含x和其他字符/数字(例如xax7,或类似):

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