我想将一个数据帧中的一系列分割文本搜索到另一个数据帧中,如果找到了,就给它们分配分数。
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以下
答案 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 我对所有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
输出包括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