我正在尝试将State
的{{1}}列与df2
的{{1}}列匹配:
State
的{{1}}列包含多个用逗号分隔的值。df1
中的一个值与State
中的值匹配时,我希望在新列df2
中匹配该值。
注意:这是伪数据。单行中出现多个匹配的可能性最小。 输入如下:
df2
所需的输出:
df1
答案 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))