如何将相应的值匹配到字符串的一部分(space之前和之后)?
How to match corresponding values to part of string (before and after space)?
我有两个数据框,想根据字符串值将第二个数据框的值添加到第一个数据框,但是如果有 space
则使用部分字符串匹配
df1:
cat
small dog
apple
df2:
cat 24
small 5
dog 400
apple 83
pear 55
我通常使用 tidyverse 中的“left_join”,即
df3 <- left_join(df1, df2, by="column_name")
df3:
cat 24
small dog NA
apple 83
但这意味着“small dog”有缺失值。这次我想做的是找到“small”或“dog”的值,然后输入较大的一个。尽管
,但我无法找到一个函数来告诉 R 在 space 之前或之后分别查看
我们可以使用 fuzzyjoin
中的 regex_left_join
,然后对 summarise
第二列进行分组 max
值
library(dplyr)
library(fuzzyjoin)
regex_left_join(df1, df2, by = "column_name") %>%
group_by(column_name = column_name.x) %>%
summarise(col2 = max(col2))
-输出
# A tibble: 3 × 2
column_name col2
<chr> <dbl>
1 apple 83
2 cat 24
3 small dog 400
数据
df1 <- structure(list(column_name = c("cat", "small dog", "apple")),
class = "data.frame", row.names = c(NA,
-3L))
df2 <- structure(list(column_name = c("cat", "small", "dog", "apple",
"pear"), col2 = c(24, 5, 400, 83, 55)), class = "data.frame", row.names = c(NA,
-5L))
另一种可能的解决方案,基于inner_join
:
library(tidyverse)
df1 %>%
mutate(spaces = row_number()*str_detect(column_name, " ")) %>%
separate_rows(column_name, sep = " ") %>%
inner_join(df2, by="column_name") %>%
group_by(spaces) %>%
mutate(col2 = if_else(spaces > 0, max(col2), col2),
column_name = if_else(spaces > 0, str_c(column_name, collapse = " "),
column_name)) %>%
ungroup %>% distinct %>% select(-spaces)
#> # A tibble: 3 × 2
#> column_name col2
#> <chr> <dbl>
#> 1 cat 24
#> 2 small dog 400
#> 3 apple 83
我有两个数据框,想根据字符串值将第二个数据框的值添加到第一个数据框,但是如果有 space
则使用部分字符串匹配df1:
cat
small dog
apple
df2:
cat 24
small 5
dog 400
apple 83
pear 55
我通常使用 tidyverse 中的“left_join”,即
df3 <- left_join(df1, df2, by="column_name")
df3:
cat 24
small dog NA
apple 83
但这意味着“small dog”有缺失值。这次我想做的是找到“small”或“dog”的值,然后输入较大的一个。尽管
,但我无法找到一个函数来告诉 R 在 space 之前或之后分别查看我们可以使用 fuzzyjoin
中的 regex_left_join
,然后对 summarise
第二列进行分组 max
值
library(dplyr)
library(fuzzyjoin)
regex_left_join(df1, df2, by = "column_name") %>%
group_by(column_name = column_name.x) %>%
summarise(col2 = max(col2))
-输出
# A tibble: 3 × 2
column_name col2
<chr> <dbl>
1 apple 83
2 cat 24
3 small dog 400
数据
df1 <- structure(list(column_name = c("cat", "small dog", "apple")),
class = "data.frame", row.names = c(NA,
-3L))
df2 <- structure(list(column_name = c("cat", "small", "dog", "apple",
"pear"), col2 = c(24, 5, 400, 83, 55)), class = "data.frame", row.names = c(NA,
-5L))
另一种可能的解决方案,基于inner_join
:
library(tidyverse)
df1 %>%
mutate(spaces = row_number()*str_detect(column_name, " ")) %>%
separate_rows(column_name, sep = " ") %>%
inner_join(df2, by="column_name") %>%
group_by(spaces) %>%
mutate(col2 = if_else(spaces > 0, max(col2), col2),
column_name = if_else(spaces > 0, str_c(column_name, collapse = " "),
column_name)) %>%
ungroup %>% distinct %>% select(-spaces)
#> # A tibble: 3 × 2
#> column_name col2
#> <chr> <dbl>
#> 1 cat 24
#> 2 small dog 400
#> 3 apple 83