我有以下数据
Search dataframe
EC name
1 2.1.1.233 helicase
2 4.1.3.3 phosphatase
3 1.3.2.1,2.5.4.1 lipase
query dataframe
PDB EC
1 1uay 2.1.1.1
2 5ad4 4.1.3.3
我想迭代query dataframe
的所有行,在search dataframe
的所有行中搜索该行中EC的值,然后如果找到一个结果,我想在query dataframe
的第三列中添加一个新值。其结果应该是:
PDB EC queryResult
1 1uay 2.1.1.1 NA
2 5ad4 4.1.3.3 found_something
我想我可以用一个函数和apply
来完成这个任务,但是它不起作用。
f = function(x) {
EC_no =x[1]
ifelse(length(grep(EC_no, searchDF$EC))>0,"found",NA)
}
data$queryResult <- apply(data,1,f)
但是,像这样手动搜索是有效的:
> ifelse(length(grep("4.1.3.3", searchDF$EC))>0,"found",NA)
[1] "found"
> ifelse(length(grep("0.0.0.0", searchDF$EC))>0, "found",NA)
[1] NA
我怎么才能让它在这个功能中工作呢?
发布于 2018-02-14 06:32:36
您可以使用sapply
> df
EC name
1 2.1.1.233 helicase
2 4.1.3.3 phosphatase
3 1.3.2.1,2.5.4.1 lipase
> df2
PDB EC
1 1uay 2.1.1.1
2 5ad4 4.1.3.3
df2$queryResult <- sapply(df2$EC, function(x) ifelse(length(grep(x, df$EC))>0, "found", NA))
> df2
PDB EC queryResult
1 1uay 2.1.1.1 <NA>
2 5ad4 4.1.3.3 found
发布于 2018-02-14 06:45:48
编辑:,因为它不是完全匹配的-删除了前面的建议。相反,我们可以创建一个模式匹配字符串用于搜索。
searchdf <- data.frame(EC = c("2.1.1.233", "4.1.3.3", "1.3.2.1.2.5.4.1"), names = c("helicase", "phosphatase", "lipase"))
querydf <- data.frame(PBD = c("1uay", "5ad4"), EC = c("2.1.1.1", "4.1.3.3"))
querydf$found <- ifelse(querydf$EC %in% unique(grep(paste(querydf$EC, collapse="|"), searchdf$EC, value=TRUE)), "found", NA)
querydf
PBD EC found
1 1uay 2.1.1.1 <NA>
2 5ad4 4.1.3.3 found
https://stackoverflow.com/questions/48789450
复制相似问题