在R中创建真/假变量
我有一个变量列,其中包含多个单词的大字符串值。我想创建一个True/False列,如果在感兴趣的列中检测到某个值,该列将报告True 我尝试了一个带有嵌入式str_检测的变异函数在R中创建真/假变量,r,string,stringr,mutate,R,String,Stringr,Mutate,我有一个变量列,其中包含多个单词的大字符串值。我想创建一个True/False列,如果在感兴趣的列中检测到某个值,该列将报告True 我尝试了一个带有嵌入式str_检测的变异函数 Dataset <- Dataset %>% mutate(new_column = str_detect('column.of.interest', "abcd")) Dataset% 突变(新列=str\u detect('column.of.interest','abcd')) 我的预期输出是
Dataset <- Dataset %>%
mutate(new_column = str_detect('column.of.interest', "abcd"))
Dataset%
突变(新列=str\u detect('column.of.interest','abcd'))
我的预期输出是我感兴趣的列中包含“abcd”的所有行在我的新列中报告为TRUE。但是,在我的新列中,每一行都报告为FALSE。这里有一个答案,它基于
ggplot2
library(ggplot2)
library(dplyr)
diamonds %>% mutate(newCol = str_detect(clarity, "1"))
答案的原始版本不好(请参见注释了解为什么上面的答案更好)
基本R版本。首先创建一个样本数据集(提问者:你应该这样做;回答者:你应该一直这样做): 看起来是这样的:
> 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
>数据集
感兴趣的ID列
1 1
2这个
3 3 abcd
四福
5 abcde
6 6
7我
我的
9个月
10完
然后做:
> Dataset$new_column <- grepl("abcd", Dataset$column.of.interest, ignore.case = T)
>数据集$new\u列数据集
ID column.of.interest new_column
1 1错误
这是假的
3 3 abcd正确
4福假
5.abcde是真的
6错误
我错了
我的错误
9月9日假
10结束错误
您可能希望也可能不希望
忽略。case
您不应该引用列名:str挈detect(column.of.interest,“abcd”)
如果在column.of.interest
周围不加引号,投票以打字错误结束,则可以正常工作。这是不好的<代码>带引号的“真”和“假”是字符类,而不是逻辑类。这会破坏一些东西,例如,isTRUE(“TRUE”)
返回FALSE
。为了避免答案不好,它应该是ifelse(str_detect(clearity,“1”)、TRUE、FALSE)
。但即使这样,也不需要ifelse
str_detect
返回TRUE
或FALSE
,无需使用ifelse
转换为TRUE
和FALSE
。越简单的变异(newCol=str_detect(clarity,“1”))
越好。你甚至不需要变异。直接操作:diamonds$newCol=str_detect(diamonds$clarity,“1”))
@Gregor,谢谢,但你不应该删除你的评论。好的。重新编辑您的问题,以获得更好的答案,但仍有评论的背景。这解决了我的问题!问题是我感兴趣的专栏周围有个“.”。非常感谢。
> 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