匹配两个数据帧的列中的字符串并创建一个新列

时间:2019-03-05 05:05:33

标签: r

我正在尝试将State的{​​{1}}列与df2的{​​{1}}列匹配:

  • 两个数据帧中的行数不相等。
  • State的{​​{1}}列包含多个用逗号分隔的值。
  • df1中的一个值与State中的值匹配时,我希望在新列df2中匹配该值。 注意:这是伪数据。单行中出现多个匹配的可能性最小。

输入如下:

df2

所需的输出:

df1

2 个答案:

答案 0 :(得分:0)

您可以使用grep轻松实现这一目标。以下是基本R中的示例:

> df1 <- data.frame(State = c("Alabama", "Maryland"), stringsAsFactors = FALSE)
> df2 <- data.frame(State = c("Alabama,North Caroline, Virginia",
+                             "Ohio, Kentucky"), stringsAsFactors = FALSE)
> 
> state_list <- unlist(strsplit(paste(df2$State, collapse = " "), ","))
> state_list
[1] "Alabama"        "North Caroline" " Virginia Ohio" " Kentucky"     
> 
> df1$Verified_State <- sapply(df1$State, function(x) {
+   grep(x, state_list, value = T)[1]
+ }, USE.NAMES = F)
> 
> df1
     State Verified_State
1  Alabama        Alabama
2 Maryland           <NA>

这假设您只需要第一个比赛

答案 1 :(得分:0)

一种tidyverse的可能性。我们使用separate_rows将逗号分隔的值分成不同的行,然后针对每个State找出df1中存在的CustomerId,然后仅选择第一个匹配项。 / p>

library(tidyverse)

bind_cols(df2, Verified_State = 
df2 %>%
   separate_rows(State) %>%
   group_by(CustomerId) %>%
   summarise(Verified_State = df1$State[which.max(df1$State %in% State)]) %>%
   pull(Verified_State))


#  CustomerId                          State Verified_State
#1          2 Alabama,NorthCaroline,Virginia        Alabama
#2          4           Alabama,WestVirginia        Alabama
#3          6                  Ohio,Kentucky           Ohio

如果每行至少有一个匹配项,则上述方法将起作用。如果可能存在根本不匹配的情况,我们可以使用if条件检查该情况

bind_cols(df2, Verified_State = 
df2 %>%
   separate_rows(State) %>%
   group_by(CustomerId) %>%
   summarise(Verified_State = if(any(df1$State %in% State)) 
   df1$State[which.max(df1$State %in% State)] else NA) %>%
   pull(Verified_State))