我正在尝试使用grepl
来标记我在遗传数据集中可能感兴趣的一些数据。
数据的示例如下所示
test <- c("AAT,TAA,TGA,A,G", "A,AAT,AAAT,AATAAT", "CA,CAA,CAAA")
pattern <- c("TAA", "G", "CAA")
df <- data.frame(test, pattern)
我要做的是创建第三列,比如说result
,评估pattern
列中的值是否在test
列中。
我试过了:
df.result <- df %>% mutate(result = grepl(pattern, test))
但出于某种原因,我在TRUE, TRUE, FALSE
列中得到了result
,这不是我所期待的 - 我希望得到TRUE, FALSE, TRUE
结果。
我已经玩过在每个字段的末尾添加一个逗号之类的东西,但这似乎也没有用。
感谢任何帮助!
谢谢, 史蒂夫
答案 0 :(得分:5)
使用apply()
功能:
df$result <- apply(df, 1, FUN=function(x) grepl(x[2], x[1])
df
# test pattern result
# 1 AAT,TAA,TGA,A,G TAA TRUE
# 2 A,AAT,AAAT,AATAAT G FALSE
# 3 CA,CAA,CAAA CAA TRUE
apply
函数分别遍历df的每一行,每行提供grepl
信息。 grepl
无法处理模式参数中包含三个元素的向量。帮助页面说:
如果提供长度为2或更大的字符向量[作为模式],则第一个元素将用于警告。
因此,原始命令grepl(df$pattern, df$test)
将pattern
(TAA)中的第一个元素与test
中的整个向量进行了比较。
答案 1 :(得分:3)
这可以通过mapply
df$result <- mapply(grepl, df$pattern, df$test)
df$result
#[1] TRUE FALSE TRUE
答案 2 :(得分:2)
stringi
包提供字符串匹配函数,这些函数在字符串和模式上进行矢量化;
library(stringi)
df %>% mutate(result = stri_detect_regex(test, pattern))
是原始问题的一个答案。关于避免子串匹配问题的答案是
df %>% mutate(result = stri_detect_regex(test, stri_join('(^|,)', pattern, '(,|$)')))