Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除字符串的一部分并使用它与另一个数据帧相交_R_Regex - Fatal编程技术网

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

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

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

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