R 将一个数据帧中的一系列文本搜索到另一个数据帧中

R 将一个数据帧中的一系列文本搜索到另一个数据帧中,r,R,我想搜索一个数据帧中的一系列拆分文本到另一个数据帧中,如果找到,则为它们分配分数 a= c("inter","cde",'c','d','e', NA) b= c("travel","dfgh",'d','f','g', 'h',NA) c= as.data.frame(rbind(a,b)) 我们有数据帧c,其中有3行,如上所述。我有另一个数据框,包含如下内容 e= c("cdes") f= c("dfgk") l=c(“cdsc”) o=c(“dfvv”) g= as.

我想搜索一个数据帧中的一系列拆分文本到另一个数据帧中,如果找到,则为它们分配分数

a= c("inter","cde",'c','d','e', NA)
b= c("travel","dfgh",'d','f','g', 'h',NA)
c= as.data.frame(rbind(a,b))
我们有数据帧c,其中有3行,如上所述。我有另一个数据框,包含如下内容

  e= c("cdes")
  f= c("dfgk")
  l=c(“cdsc”)
  o=c(“dfvv”)
  g= as.data.frame(rbind(e,f,l,o))
所以对于“cde”,在c数据帧中拆分为c、d、e、NA。对于“cde”,实际名称为inter。现在我想搜索c,然后是d,然后是e,它是从数据帧g中的“cde”中分离出来的。如果在g中的一行中找到c,则在同一行中搜索d和e,并在所有相邻的位置分配分数100。当NA出现时,打破循环并转到下一行搜索,即d、f、g

输出应该是

  V0        V      V1  Score1   V2  Score2  V3  Score3   V4   Score4     V5
 inter     cde      c   100%     d   100%   e    100%    NA    0%       cdes
 travel    dfgh     d   100%     f   100%   g    100%    h     0%       dfgk

因此,在输出中,所有的评分都完成了,并且它也给出了数据帧g中的匹配行,其中匹配已经执行。数据帧g中更匹配的一个应该在V5下

您正在寻找类似的东西吗

aux =apply(c,2,function(x){              # Run function for each column of c
  aux=rep("0%",nrow(g))                  # Create adjacent column with all 0%
  for (i in 1:nrow(g)){                  # For each row of g
    if (grepl(x[i],g[i,],fixed = TRUE)){ # If the letter is found in the text
      aux[i] = "100%"                    # update the 0% with 100%
    }
  }
  cbind(x,aux)                           # join 'c' column to the % column
})

dim(aux)=c(nrow(g),ncol(c)*2)            # reshape the results dimension

> aux
     [,1] [,2]   [,3] [,4]   [,5] [,6]   [,7] [,8]
[1,] "c"  "100%" "d"  "100%" "e"  "100%" "NA" "0%"
[2,] "d"  "100%" "f"  "100%" "g"  "100%" "h"  "0%"
注:我对任何
nrow
ncol

您可以使用以下命令添加名称:

colnames(aux)=c(rbind(paste0("V",1:(ncol(aux)/2)),
                      paste0("Score",1:(ncol(aux)/2))))
编辑

我真的不明白你的部分代码的意义。。。为什么需要
o
l
???不过,这应该会给你想要的结果

g = as.data.frame(rbind(e,f),stringsAsFactors = FALSE)
c = as.data.frame(rbind(a,b)) 

aux =apply(c[,-(1:2)],2,function(x){                      # Run function for each column of c
  print(x)        
  aux=rep("0%",nrow(g))                          # Create adjacent column with all 0%
  for (i in 1:nrow(g)){                          # For each row of g
    is_it_in = grepl(x[i],g[i,],fixed = TRUE)
    if (ifelse(is.na(is_it_in),FALSE,is_it_in)){ # If the letter is found in the text
      aux[i] = "100%"                            # update the 0% with 100%
    }
  }
  cbind(x,aux)                                   # join 'c' column to the % column
})

dim(aux)=c(nrow(g),(ncol(c)-2)*2)                # reshape the results dimension
res = cbind(c[,1:2],aux,g)                       # Join everything
names(res) = c("V0","V",c(rbind(paste0("V",1:(ncol(res)/2)),
                           paste0("Score",1:(ncol(res)/2)))))[-(ncol(res)+1)]

> res
      V0    V V1 Score1 V2 Score2 V3 Score3   V4 Score4   V5
a  inter  cde  c   100%  d   100%  e   100% <NA>     0% cdes
b travel dfgh  d   100%  f   100%  g   100%    h     0% dfgk
g=as.data.frame(rbind(e,f),stringsAsFactors=FALSE)
c=as.data.frame(rbind(a,b))
aux=apply(c[,-(1:2)],2,函数(x){为c的每一列运行函数
打印(x)
aux=rep(“0%”,nrow(g))#使用所有0%创建相邻列
对于(i in 1:nrow(g)){#对于g的每一行
它在=grepl(x[i],g[i,],fixed=TRUE)中吗
if(ifelse(is.na(is_it_;in)、FALSE、is_it___in)){如果在文本中找到了该字母
aux[i]=“100%”#将0%更新为100%
}
}
cbind(x,aux)#将“c”列连接到%列
})
dim(aux)=c(nrow(g),(ncol(c)-2)*2)#重塑结果维度
res=cbind(c[,1:2],aux,g)#连接所有事物
名称(res)=c(“V0”,“V”,c(rbind(paste0(“V”,1:(ncol(res)/2)),
paste0(“分数”,1:(ncol(res)/2()(()))][-(ncol(res)+1)]
>res
V0 V V1分数1 V2分数2 V3分数3 V4分数4 V5
内部cde c 100%d 100%e 100%0%cde
b行程dfgh d 100%f 100%g 100%h 0%dfgk
包括l和o时的输出。然而,理想情况下,只有两行应该出现,因为他们是更接近匹配

  V0    V V1 Score1 V2 Score2 V3 Score3   V4 Score4    V5 Score5   V6
 inter  cde  c   100%  d   100%  e   100% <NA>     0% inter     0% cdes
 travel dfgh  d   100%  f   100%  g   100%    h     0%  <NA>     0% dfgk
 inter  cde  c     0%  d     0%  e     0% <NA>     0% inter     0% cdsc
 travel dfgh  d     0%  f     0%  g     0%    h     0%  <NA>     0% dfvv
V0 V V1评分1 V2评分2 V3评分3 V4评分4 V5评分5 V6
内部cde c 100%d 100%e 100%0%内部0%cde
行程dfgh d 100%f 100%g 100%h 0%0%dfgk
内部cde c 0%d 0%e 0%0%0%内部0%cdsc
行程dfgh d 0%f 0%g 0%h 0%0%dfvv

请显示您的最终结果。如果NA意味着丢失,而不是字符串,也不要在其周围加引号。最终输出是,如果找到c,则给它100%的分数,然后转到下一个查找d,如果找到,则再次给它100%的分数,依此类推。所有分数应在新的相邻列中。希望这有帮助。但是,当使用concat.split将c、d、e组合拆分为3时,它们是相同的名称。现在,将在另一个包含cde的数据帧中单独搜索它们。这个过程就是这样的,@Elin所说的是,你应该实际展示最终输出应该是什么样子,而不仅仅是解释它。请写一个输出数据框的示例。您的数据为什么必须在一个有两行多列的数据框中,而不是一列用于
,一列用于
,一列用于
分数
?我问这个问题是因为它在长格式中可能更容易。我对上面的场景非常满意。可能主要的问题是获取分数以查看匹配的准确性。运行上述代码会出现以下错误“if中的错误(grepl(x[I],g[I,],fixed=TRUE)){:参数不可解释为逻辑”是的,我忘了提到:您的字符被编码为
factors
。当您定义
c
g
时,在末尾添加
stringsafactors=FALSE
。因此,对于
c
c=as.data.frame(rbind(e,f),stringsafactors=FALSE)
我添加了它,然后只有我运行了代码,它仍然抛出相同的代码error@samadrazakhan我只是复制并粘贴了您的示例数据,然后复制并粘贴了boski的代码,即使有这些因素,一切都运行得很好。您是否在某个地方更改了某些内容,或者使用了不同的数据?1)如果代码每周一次适用于整行d然后移动到下一行。根据我的条件,它首先在数据帧g中找到“c”,一旦找到,它就会在下一列中找到d,但它在同一行中。此外,它在“cde”中只找到了d,而不在任何其他行中,因为c只存在于其中。它是这样工作的吗?2)你能给我强调一下代码是如何工作的吗?@格什特