Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在两个不同数据帧的每行中查找相似字符串_R - Fatal编程技术网

R 在两个不同数据帧的每行中查找相似字符串

R 在两个不同数据帧的每行中查找相似字符串,r,R,我想检查两个数据集。一个数据有许多列(本例有两列df1),一个数据有一列(df2) 首先,我想检查df1每一行的第一列以及df2的所有部分,如果发现任何类似部分,则写入df1和df2的行号 比如说 df1的第1列有两个与df1的第3行中的df2 Q9Y6Q9和df2的第4行中的Q9Y6Q9相似的行部分。所以输出是3-4,其他的也一样也许你应该先规范化你的数据。例如,您可以执行以下操作: normalize <- function(x, delim) { x <- gsub("

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

首先,我想检查df1每一行的第一列以及df2的所有部分,如果发现任何类似部分,则写入df1和df2的行号

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

也许你应该先规范化你的数据。例如,您可以执行以下操作:

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))
}
使用此规范化数据,可以轻松生成您要查找的输出:

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"
现在,
res
是一个由
df1
的列名索引的列表:

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

也许你应该先规范化你的数据。例如,您可以执行以下操作:

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))
}
使用此规范化数据,可以轻松生成您要查找的输出:

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"
现在,
res
是一个由
df1
的列名索引的列表:

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

我觉得你的语法让我很反感,也许英语不是你的母语,但我不太懂。但是,我认为这涉及到使用
for
循环逐行遍历两个数据帧,以及
for
循环中的
if
语句,该语句检查您的条件是否满足并进行编辑(如果满足)。不确定您真正想要的是什么,因为您的规范与预期输出不匹配。但是,这里有一行代码可以在df2的相应行中的df1$sample_1列中找到任何“子字符串”<代码>应用(df1,1,函数(x)grep(粘贴(未列出(strsplit(x[1],“;”)),折叠=“|”),df2$subunits..UniProt.IDs。)@Gopala谢谢,但下面是正确的答案。不过,我仍在等待一些修改,如果你有任何想法,你可以调整他的回答。我认为你的语法让我很反感,也许英语不是你的母语,但我不太理解。但是,我认为这涉及到使用
for
循环逐行遍历两个数据帧,以及
for
循环中的
if
语句,该语句检查您的条件是否满足并进行编辑(如果满足)。不确定您真正想要的是什么,因为您的规范与预期输出不匹配。但是,这里有一行代码可以在df2的相应行中的df1$sample_1列中找到任何“子字符串”<代码>应用(df1,1,函数(x)grep(粘贴(未列出(strsplit(x[1],“;”)),折叠=“|”),df2$subunits..UniProt.IDs。)@Gopala谢谢,但下面是正确的答案。不过,我还在等待一些修改,如果你有任何想法,你可以调整他的回答我不知道如何感谢你。我已经喜欢你的答案了。我有两个要求。我可以使用1-a命令生成s1到s个df1列数吗?所以我不需要手动制作它们。2-只给我df2的行数。例如进程(s1)#[1]“4”“1”“4”。编辑答案以解决您的问题。我不知道如何感谢您。我已经喜欢你的答案了。我有两个要求。我可以使用1-a命令生成s1到s个df1列数吗?所以我不需要手动制作它们。2-只给我df2的行数。例如,process(s1)#[1]“4”“1”“4”。编辑答案以解决您的问题。