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)你能给我强调一下代码是如何工作的吗?@格什特