[英]Group by one column and check for value in another column in R
這是我的原始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
,我希望用dplyr
完成它。 count if
謂詞,這是一種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
當我們尋找'col_1'的每個唯一元素中是否存在'x' %in%
的'col2'時,按'col_1'分組后,獲得長度為1的邏輯矢量,其中%in%
(通過放置“ x在%in%的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"))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.