在一个数据框中搜索一系列文本到另一个数据框中

时间:2019-05-17 08:57:04

标签: 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.data.frame(rbind(e,f,l,o))

因此对于“ cde”,在c数据帧中分为c,d,e,NA。对于“ cde”,实际名称为inter。现在我要搜索从数据帧g中的“ cde”拆分而来的c然后d然后e。如果在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以下

1 个答案:

答案 0 :(得分:1)

您是否正在寻找类似的东西?

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%"

note 我对所有nrowncol

进行了通用化的代码

您可以使用添加名称

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

修改

我不太了解您的代码部分的重点...为什么需要ol?不过,这应该可以为您提供想要的结果。

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

输出包括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