簡體   English   中英

按一列分組,然后檢查R中另一列的值

[英]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以及其他字符/數字(例如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

當我們尋找'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM