在R

时间:2016-06-02 16:16:11

标签: r

我正在尝试使用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结果。

我已经玩过在每个字段的末尾添加一个逗号之类的东西,但这似乎也没有用。

感谢任何帮助!

谢谢, 史蒂夫

3 个答案:

答案 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, '(,|$)')))