Сгруппировать по одному столбцу и проверить значение в другом столбце в R - PullRequest
0 голосов
/ 06 февраля 2019

Вот мой оригинальный 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, но не может его найти.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Поскольку мы ищем, существует ли «x» %in% «col2» для каждого уникального элемента «col_1», после группировки по «col_1» получаем логический вектор длины 1 с %in% (поместив "x" в левую часть% в%) и преобразовав его в двоичный файл с 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"))))
0 голосов
/ 06 февраля 2019

Это один из способов сделать это, он также будет надежным, если ваш 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
...