由一个列组和在R中的另一列检查值

问题描述 投票:-1回答:2

这是我原来的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和返回1,如果col_2给定组包含x和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谓词,但无法找到它。

r group-by dplyr countif
2个回答
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

2
投票

正如我们在寻找是否存在的“x” %in%的“COL2”为“COL_1”各自独特的元件中,通过“COL_1”分组后,得到长度1与%in%(的逻辑矢量通过将“X”在LHS在%的%),并将其转换为与as.integer二进制

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

如果“x”为仅一个部分匹配,则使用str_detect

library(stringr)
my_df_1 %>%
    group_by(col_1) %>%
    mutate(col_3 = +(any(str_detect(col_2, "x"))))
© www.soinside.com 2019 - 2024. All rights reserved.