R 删除字符串的一部分并使用它与另一个数据帧相交
我尝试比较两个数据帧,并根据一列字符串找到它们的重叠。然而,其中一些有一个额外的和不必要的补充。例如,一个df中的“C8 H12 O1”应等于“C8 H12 O1 Na1”。我想从任何可能包含“Na1”的字符串中删除它 我想我需要使用正则表达式来实现这一点,但我无法得到一个句柄来实现这一点-R 删除字符串的一部分并使用它与另一个数据帧相交,r,regex,R,Regex,我尝试比较两个数据帧,并根据一列字符串找到它们的重叠。然而,其中一些有一个额外的和不必要的补充。例如,一个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
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%"
list1您可以通过在其周围抛出一个gsub
来忽略Na1
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
向我们展示一个输入示例(我们需要了解什么是额外的列)及其相应的输出示例。如果可能,还可以展示一些关于正则表达式的研究作为起点。这很有效。我还对其进行了一些更改,以便%相似性更有意义。intersectlength