Создайте переменную true / false в R

У меня есть один столбец переменных, который содержит большие строковые значения, состоящие из нескольких слов. Я хочу создать столбец True / False, который сообщает истину, если в интересующем столбце обнаружено определенное значение.

Я пробовал функцию изменения со встроенным str_detect.

Dataset <- Dataset %>%
  mutate(new_column = str_detect('column.of.interest', "abcd"))

Мой ожидаемый результат был для всех строк, в которых мой интересующий столбец содержал «abcd», в моем новом столбце он будет отображаться как ИСТИНА. Однако в моем новом столбце каждая строка отображается как ЛОЖЬ.


person Kyle Buffin    schedule 16.04.2019    source источник
comment
Вы не должны указывать имя столбца: str_detect(column.of.interest, "abcd")   -  person Marius    schedule 16.04.2019
comment
Должно работать нормально без кавычек вокруг column.of.interest, голосование за закрытие как опечатку.   -  person Gregor Thomas    schedule 16.04.2019


Ответы (2)


Вот один ответ, основанный на наборе данных из ggplot2

library(ggplot2)
library(dplyr)

diamonds %>% mutate(newCol = str_detect(clarity, "1"))

Исходная плохая версия ответа (см. Комментарии, почему это лучше)

diamonds %>% mutate(newCol = ifelse(str_detect(clarity, "1"), "TRUE", "FALSE"))
person MarBlo    schedule 16.04.2019
comment
Это плохо. "TRUE" и "FALSE" в кавычках относятся к character классу, а не logical классу. Это может привести к поломке, например, isTRUE("TRUE") возвращает FALSE. Чтобы ответ не был плохим, он должен быть ifelse(str_detect(clarity, "1"), TRUE, FALSE). Но даже в этом случае ifelse не нужен. str_detect возвращает TRUE или FALSE, вам не нужно использовать ifelse для преобразования в TRUE и FALSE. Чем проще mutate(newCol = str_detect(clarity, "1")), тем лучше. - person Gregor Thomas; 16.04.2019
comment
Вам даже не нужен mutate. Сделайте это напрямую: diamonds$newCol = str_detect(diamonds$clarity, "1")) - person Spacedman; 16.04.2019
comment
@Gregor, спасибо, но вы не должны удалять свой комментарий. - person MarBlo; 16.04.2019
comment
Хорошо. Отредактировал ваш вопрос, чтобы дать лучший ответ, но при этом остался контекст для комментария. - person Gregor Thomas; 16.04.2019
comment
Это решило мою проблему! Проблема заключалась в том, что у меня была «круглая колонка интересов». Спасибо! - person Kyle Buffin; 17.04.2019

Базовая версия R. Сначала создайте образец набора данных (спрашивающий: вы должны были это сделать; отвечающие: вы всегда должны делать это):

> Dataset = data.frame(ID=1:10, column.of.interest=c(NA,"This","abcd","Foo","the abcde",NA,"Me","my","mo","END"))

что выглядит так:

> Dataset
   ID column.of.interest
1   1               <NA>
2   2               This
3   3               abcd
4   4                Foo
5   5          the abcde
6   6               <NA>
7   7                 Me
8   8                 my
9   9                 mo
10 10                END

Затем сделайте:

> Dataset$new_column <- grepl("abcd", Dataset$column.of.interest, ignore.case = T)

получить:

> Dataset
   ID column.of.interest new_column
1   1               <NA>      FALSE
2   2               This      FALSE
3   3               abcd       TRUE
4   4                Foo      FALSE
5   5          the abcde       TRUE
6   6               <NA>      FALSE
7   7                 Me      FALSE
8   8                 my      FALSE
9   9                 mo      FALSE
10 10                END      FALSE

Вы можете захотеть или не захотеть ignore.case.

person Spacedman    schedule 16.04.2019