R: Обновить столбец на основе условия текста из другого столбца - PullRequest
0 голосов
/ 25 октября 2019

Я хотел бы создать новый столбец в моем фрейме данных, используя условный оператор, который сказал бы: «Если Column_y содержит Column_x, то 1 else 0»

Например:

Event   Name     Winner       Loser          New Column
1       James    James,Bob    John,Steve     1
1       Bob      James,Bob    John,Steve     1
1       John     James,Bob    John,Steve     0
1       Steve    James,Bob    John,Steve     0

Я хочу иметь новый столбец <- "Если Winner содержит Имя, то 1, иначе 0" </p>

Имейте в виду, что это для 100 000 строк и, возможно, 700 уникальных имен. Когда я пробую что-то вроде

df$NewColumn<-ifelse(grepl(df$Name,df$Winner)==TRUE,1,0) 

или вариации, я получаю сообщение "шаблон имеет длину> 1".

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Я думаю, вы просто хотите сравнить столбец Name со столбцом Winner:

df$NewColumn <- ifelse(df$Name == df$Winner, 1, 0)

Обратите внимание, что, поскольку df$Name == df$Winner на самом деле является логическим выражением, вы также можете упроститьдо:

df$NewColumn <- df$Name == df$Winner
0 голосов
/ 25 октября 2019

В вашем примере точное совпадение строк работает. Но я предполагаю, что это не относится ко всем вашим данным.

Реализация условия содержимого будет выглядеть примерно так:


library(dplyr)
library(purrr)

df = df %>% 
  dplyr::mutate(NewColumn = purrr::map2_dbl(.x=Winner,.y=Name,~ifelse(grepl(.y,.x),1,0)))

Добавление альтернативного решения с помощью stringr:

df = df %>% 
  dplyr::mutate(NewColumn=ifelse(str_detect(Winner,Name),1,0))

Дайте мне знать, если это работает.

PS: str_detect быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...