这是我原来的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
谓词,但无法找到它。
这是做这件事的方法之一,它也将是强大的,如果你的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
正如我们在寻找是否存在的“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"))))