R中的模式搜索

R中的模式搜索,r,R,我有两个数据帧,如下所示。DF1有点凌乱(如下所示),它将来自DF2的多个值合并到一列中 DF1 SRNo. Value 1 1ABCD2EFGH3IJKL 2 1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV 3 3ABCD4EFGH5IJKL 4 3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL 5 7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH DF1 斯诺。价值 1 BCD2EFGH3

我有两个数据帧,如下所示。DF1有点凌乱(如下所示),它将来自DF2的多个值合并到一列中

DF1 SRNo. Value 1 1ABCD2EFGH3IJKL 2 1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV 3 3ABCD4EFGH5IJKL 4 3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL 5 7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH DF1 斯诺。价值 1 BCD2EFGH3IJKL 2 BCD2EFGH3IJKL/7MLPO0OKMN8MNBV 3 BCD4EFGH5IJKL 4 BCD4EFGH5IJKL/1ABCD2EFGH3IJKL 5 7MnOKMn8MnBv/9IUYT7HGFD3LKJH DF2 斯诺。价值 1 BCD2EFGH3IJKL 2 BCD4EFGH5IJKL 3 6PQRS7TUVW8XYZA 4 5FGHI9XUZX1RATP 5 9AGTY6UGFW0AAUU 6 TEYD7 RARA8帽子 7 9IUYT7HGFD3LKJH 我想在两个数据集中使用values列进行查找。以下是我正在努力实现的目标

i) 对于DF1中的第1行和第3行,它是DF2中的一个简单查找。我希望代码返回那些查找到的值
ii)对于DF1中的第3行,只有字符串的第一部分与DF2中的值匹配。我希望代码只返回第一部分
iii)对于DF1中的第4行,字符串中的两个部分都与DF2中的值匹配。在这种情况下,我希望保留匹配字符串的第一部分
iv)对于第5行,字符串中的第二部分与DF2中的值匹配。我希望代码返回字符串的第二部分

我在第一个数据集中有大约47000行,在第二个数据集中有超过300000行,当然在这两个数据集中还有其他列。我使用str_split/str_match以多种方式尝试了这一点,但无法实现我想要的。感谢您的每一个建议。我剩下的代码是R


谢谢您

第一步是将您的DF1设置为“/”
tidyr::separate()。然后我使用
dplyr::case_when()
查看DF2中列出的第一个项目与%
中的
%是否匹配;如果没有,那么检查第二个。我使用
dplyr::mutate()
将结果附加到
dat
下的DF1

library(dplyr)
library(tidyr)

DF1 <- data.frame("SRNo." = 1:5, Value = c("1ABCD2EFGH3IJKL","1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV","3ABCD4EFGH5IJKL","3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL","7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH"), stringsAsFactors = F) %>% tbl_df()

DF2 <- data.frame("SRNo." = 1:7, Value = c("1ABCD2EFGH3IJKL","3ABCD4EFGH5IJKL","6PQRS7TUVW8XYZA","5FGHI9XUZX1RATP","9AGTY6UGFW0AAUU","6TEYD7RARA8MHAT","9IUYT7HGFD3LKJH"), stringsAsFactors = F) %>%tbl_df()

DF1 %>%
  separate(Value, c("Value1", "Value2"), sep = "/")  %>%
  mutate(dat = case_when(
    Value1 %in% DF2$Value ~ Value1,
    Value2 %in% DF2$Value ~ Value2,
    TRUE ~ NA_character_
  ))

# # A tibble: 5 x 4
#   SRNo. Value1          Value2          dat            
#   <int> <chr>           <chr>           <chr>          
# 1     1 1ABCD2EFGH3IJKL NA              1ABCD2EFGH3IJKL
# 2     2 1ABCD2EFGH3IJKL 7MLPO0OKMN8MNBV 1ABCD2EFGH3IJKL
# 3     3 3ABCD4EFGH5IJKL NA              3ABCD4EFGH5IJKL
# 4     4 3ABCD4EFGH5IJKL 1ABCD2EFGH3IJKL 3ABCD4EFGH5IJKL
# 5     5 7MLPO0OKMN8MNBV 9IUYT7HGFD3LKJH 9IUYT7HGFD3LKJH
库(dplyr)
图书馆(tidyr)
DF1%tbl_df()
DF2%tbl_df()
DF1%>%
单独(值,c(“值1”、“值2”),sep=“/”%>%
变异(dat=情况_,当(
%DF2$Value~Value1中的Value1%,
%DF2$Value~Value2中的Value2%,
真~NA_性格_
))
##A tibble:5 x 4
#斯诺。值1值2 dat
#                                    
#1 1ABCD2EFGH3IJKL NA 1ABCD2EFGH3IJKL
#2 BCD2EFGH3IJKL 7MLPO0OKMN8MNBV 1ABCD2EFGH3IJKL
#3 3 BCD4EFGH5IJKL NA 3 BCD4EFGH5IJKL
#4 4 BCD4EFGH5IJKL 1ABCD2EFGH3IJKL 3ABCD4EFGH5IJKL
#5 7MLPO0OKMN8MNBV 9IUYT7HGFD3LKJH 9IUYT7HGFD3LKJH
数据表解决方案

df1 <- read.table(text="SRNo.      Value
                  1      1ABCD2EFGH3IJKL
                  2      1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV
                  3      3ABCD4EFGH5IJKL
                  4      3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL
                  5      7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH", header = T, stringsAsFactors = F)

df2 <- read.table( text = "SRNo.   Value
                   1   1ABCD2EFGH3IJKL
                   2   3ABCD4EFGH5IJKL
                   3   6PQRS7TUVW8XYZA
                   4   5FGHI9XUZX1RATP
                   5   9AGTY6UGFW0AAUU
                   6   6TEYD7RARA8MHAT
                   7   9IUYT7HGFD3LKJH", header = T, stringsAsFactors = F )

library( data.table )
setDT(df1)[, c( "Value1", "Value2" ) := tstrsplit( Value, "/", fixed = TRUE)]
setDT(df2)

resultv1 <- df2[ df1, on = c( Value = "Value1"), nomatch = 0L ]
resultv2 <- df2[ df1, on = c( Value = "Value2"), nomatch = 0L ]

result <- rbindlist( list( resultv1, resultv2 ) )[!duplicated( i.SRNo.)]

请在您的问题中添加所需的结果。非常感谢。这个解决方案很容易奏效。再次感谢您的问题,如果您认为这是解决您问题的最佳方案,请给出我的答案。
df1 <- read.table(text="SRNo.      Value
                  1      1ABCD2EFGH3IJKL
                  2      1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV
                  3      3ABCD4EFGH5IJKL
                  4      3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL
                  5      7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH", header = T, stringsAsFactors = F)

df2 <- read.table( text = "SRNo.   Value
                   1   1ABCD2EFGH3IJKL
                   2   3ABCD4EFGH5IJKL
                   3   6PQRS7TUVW8XYZA
                   4   5FGHI9XUZX1RATP
                   5   9AGTY6UGFW0AAUU
                   6   6TEYD7RARA8MHAT
                   7   9IUYT7HGFD3LKJH", header = T, stringsAsFactors = F )

library( data.table )
setDT(df1)[, c( "Value1", "Value2" ) := tstrsplit( Value, "/", fixed = TRUE)]
setDT(df2)

resultv1 <- df2[ df1, on = c( Value = "Value1"), nomatch = 0L ]
resultv2 <- df2[ df1, on = c( Value = "Value2"), nomatch = 0L ]

result <- rbindlist( list( resultv1, resultv2 ) )[!duplicated( i.SRNo.)]
rbindlist( list( setDT(df2)[ setDT(df1)[, c( "Value1", "Value2" ) := tstrsplit( Value, "/", fixed = TRUE)], 
                               on = c( Value = "Value1"), nomatch = 0L ], 
                   setDT(df2)[ setDT(df1)[, c( "Value1", "Value2" ) := tstrsplit( Value, "/", fixed = TRUE)], 
                               on = c( Value = "Value2"), nomatch = 0L ] ) )[!duplicated( i.SRNo.)]