我有两个数据帧,我试图比较,并根据一列字符串找到它们的重叠。但是,其中一些对它们有额外的和不必要的补充。例如,一个df中的'C8 H12 O1'应该等于'C8 H12 O1 Na1'。我想从任何可能拥有它的字符串中删除'Na1'。
我认为我需要使用正则表达式,但是我无法理解这一点。我想通过使用这个示例代码找出如何找到它们的重叠% -
list1 <- c('C8 H12 O1 Na1', 'C15 H20 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1')
list2 <- c('C8 H12 O1', 'C19 H26 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1')
df1 <- data.frame(list1)
colnames(df1) <- "Composition"
df2 <- data.frame(list2)
colnames(df2) <- "Composition"
paste0(round(100*length(intersect(df1$Composition,
df2$Composition))/nrow(df2)), "%")
# [1] "50%"
由于第一个条目具有“相同”字符串减去Na1,因此实际百分比在技术上应为75%。
你可以通过在它周围扔一个Na1
来忽略gsub
。
paste0(round(100*length(intersect(gsub(" Na1", "", df1$Composition),
gsub(" Na1", "", df2$Composition)))/nrow(df2)), "%")
# [1] "75%"
你可以使用startsWith
。以下将所有匹配组合加起来并按list2
的长度除以......
sum(outer(list1, list2, startsWith),
outer(list2, list1, startsWith)) / length(list2)
[1] 0.75