【问题标题】:finding similar strings in each row of two different data frame在两个不同数据框的每一行中查找相似的字符串
【发布时间】:2016-02-25 21:58:58
【问题描述】:

我想检查两个数据集。一个数据有很多列(这个例子有两列df1),一个数据有一列(df2

首先,我想检查 df1 每一行的第一列以及 df2 的所有部分,如果找到任何相似的部分,那么 df1 的行号和df2 写成

例如 df1 的第 1 列有两个与 df1 第 3 行中的 df2 Q9Y6Q9 相似的行部分,其中 Q9Y6Q9 在 df2 的第 4 行中。所以输出是 3-4 ,其他的也一样

【问题讨论】:

  • 我觉得你的语法让我很反感,也许英语不是你的母语,但我不太明白。但是,我认为这涉及使用for 循环逐行循环遍历您的两个数据帧,并在for 循环中使用if 语句检查您的条件是否满足,如果满足则进行编辑。
  • 不确定您真正追求的是什么,因为您的规范与预期输出不匹配。但是,这里有一行代码可以在 df2 的相应行中找到 df1$sample_1 列中的任何“子字符串”。 apply(df1, 1, function(x) grep(paste(unlist(strsplit(x[1], ';')), collapse = '|'), df2$subunits..UniProt.IDs.))
  • @Gopala 谢谢,但以下是正确答案。不过,我还在等待一些修改,如果你有什么想法,你可以调整他的答案

标签: r


【解决方案1】:

也许您应该先规范化您的数据。例如,您可以这样做:

normalize <- function(x, delim) {
    x <- gsub(")", "", x, fixed=TRUE)
    x <- gsub("(", "", x, fixed=TRUE)
    idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "", as.character(x)))+1)
    names <- unlist(strsplit(as.character(x), delim))
    return(setNames(idx, names))
}

这个函数可以应用于df1的每一列以及查找表df2

s1 <- normalize(df1[,1], ";")
s2 <- normalize(df1[,2], ";")
lookup <- normalize(df2[,1], ",")

有了这个标准化的数据,很容易生成你要找的输出:

process <- function(s) {
    lookup_try <- lookup[names(s)]
    found <- which(!is.na(lookup_try))
    pos <- lookup_try[names(s)[found]]
    return(paste(s[found], pos, sep="-"))
    #change the last line to "return(as.character(pos))" to get only the result as in the comment
}

process(s1)
# [1] "3-4" "4-1" "5-4"
process(s2)
# [1] "2-4"  "3-15" "7-16"

输出与问题中的不完全相同,但这可能是由于手动查找错误。

为了遍历df1 的所有列,您可以使用lapply

res <- lapply(colnames(df1), function(x) process(normalize(df1[,x], ";")))
names(res) <- colnames(df1)

现在,res 是一个由df1 的列名索引的列表:

res[["sample_1"]]
# [1] "4" "1" "4"

【讨论】:

  • 我不知道该怎么感谢你。我已经喜欢你的回答了。我有两个要求。我可以制作 1- 一个生成 s1 到 df1 列数的命令吗?所以我不需要手动制作它们。 2-只给我 df2 的行数。例如 process(s1) # [1] "4" "1" "4" .
  • 编辑了答案以解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2018-01-12
  • 2018-06-20
  • 2014-10-18
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
相关资源
最近更新 更多