R中的模式搜索
我有两个数据帧,如下所示。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中的一个简单查找。我希望代码返回那些查找到的值R中的模式搜索,r,R,我有两个数据帧,如下所示。DF1有点凌乱(如下所示),它将来自DF2的多个值合并到一列中 DF1 SRNo. Value 1 1ABCD2EFGH3IJKL 2 1ABCD2EFGH3IJKL/7MLPO0OKMN8MNBV 3 3ABCD4EFGH5IJKL 4 3ABCD4EFGH5IJKL/1ABCD2EFGH3IJKL 5 7MLPO0OKMN8MNBV/9IUYT7HGFD3LKJH DF1 斯诺。价值 1 BCD2EFGH3
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.)]