删除字符串的一部分并使用它与另一个数据帧相交

问题描述 投票:2回答:2

我有两个数据帧,我试图比较,并根据一列字符串找到它们的重叠。但是,其中一些对它们有额外的和不必要的补充。例如,一个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%。

r regex
2个回答
0
投票

你可以通过在它周围扔一个Na1来忽略gsub

paste0(round(100*length(intersect(gsub(" Na1", "", df1$Composition), 
                                  gsub(" Na1", "", df2$Composition)))/nrow(df2)), "%")
# [1] "75%"

0
投票

你可以使用startsWith。以下将所有匹配组合加起来并按list2的长度除以......

sum(outer(list1, list2, startsWith),
    outer(list2, list1, startsWith)) / length(list2)

[1] 0.75
© www.soinside.com 2019 - 2024. All rights reserved.