【发布时间】:2018-11-15 14:48:48
【问题描述】:
我有一个数据框,其中包含一个以逗号分隔的单词列表的列:
df <- data.frame(gene=c("1", "2", "3", "4"), affected_genes = c("Rim2, CG18208", "ANB, XYZ", "Gene1, Gene2", "XYZ"))
gene affected_genes
1 Rim2, CG18208
2 ANB, XYZ
3 Gene1, Gene2
4 XYZ
我想过滤掉affected_genes 不包含XYZ 的行。这是我正在尝试的:
library(dplyr)
geneIn <- function(gene, gene_list){
gene %in% sapply(gene_list, function(x) strsplit(x, ", ")[[1]], USE.NAMES=FALSE)
}
df %>%
dplyr::filter(geneIn("XYZ", affected_genes))
但是,Error in filter_impl(.data, quo) :
Evaluation error: non-character argument. 失败
当我跑步时:
affected_genes <- "ANB, XYZ"
geneIn("XYZ", affected_genes)
我得到了我的预期结果 (TRUE)。谁能建议我在第一个示例中做错了什么?
【问题讨论】:
-
我建议你创建一些整洁的数据。即使是列表列也会比您现在拥有的更好。
-
您的geneIn 函数应该将
affected_gene的向量作为输入并返回一个布尔向量。 -
你的affected_genes列有没有可能是一个因素而不是字符?如果您使用您的数据但添加
stringsAsFactors=FALSE它工作正常。好吧,不好,但它不会给出这个错误。 -
仅供参考,您可以简单地做
df[grepl('\\bXYZ\\b', df$affected_genes),]