gpt4 book ai didi

r - 比较 dplyr 中的字符串

转载 作者:行者123 更新时间:2023-12-04 02:35:44 26 4
gpt4 key购买 nike

我的数据框看起来像:

df <- tibble::tribble(
~order_id, ~user_id, ~comp_order, ~comp_rec,
1164320, 32924, "4-6-22-11-37-5", "4-5-6-11-22-36-37",
1169182, 33128, "9-4-15-28-8-7", "4-7-8-9-28-37-38",
1166014, 33003, "27-22-4-6-5", "4-5-6-22-27-36-37",
1166019, 32996, "27-22-4-6-8", "4-6-8-22-27-36-38"
)

我想知道 comp_order 列中而不是 comp_rec 中存在的数字。

最终输出应该是这样的:

  order_id user_id comp_rec          comp_order     is_equal elements_removed_from_rec elements_added_to_order
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
1 1164320 32924 4-5-6-11-22-36-37 4-6-22-11-37-5 no 36 none
2 1169182 33128 4-7-8-9-28-37-38 9-4-15-28-8-7 no 37 none
3 1166014 33003 4-5-6-22-27-36-37 27-22-4-6-5 no 36-37 none
4 1166019 32996 4-6-8-22-27-36-38 27-22-4-6-8 no 36-38 none
5 1166012 32922 27-22-4-6-8 27-22-4-6-8 yes none none
6 1166033 32911 27-22-4-6-8 27-22-4-6-8-33 no none 33

df_output <- tibble::tribble(
~order_id, ~user_id, ~comp_rec, ~comp_order, ~is_equal, ~elements_removed_from_rec, ~elements_added_to_order,
1164320, 32924, "4-5-6-11-22-36-37", "4-6-22-11-37-5", "no", "36", "none",
1169182, 33128, "4-7-8-9-28-37-38", "9-4-15-28-8-7", "no", "37", "none",
1166014, 33003, "4-5-6-22-27-36-37", "27-22-4-6-5", "no", "36-37", "none",
1166019, 32996, "4-6-8-22-27-36-38", "27-22-4-6-8", "no", "36-38", "none",
1166012, 32922, "27-22-4-6-8", "27-22-4-6-8", "yes", "none", "none",
1166033, 32911, "27-22-4-6-8", "27-22-4-6-8-33", "no", "none", "33"
)

我需要知道:

  1. 已从 rec 中删除的内容
  2. 已添加到订单中的内容

根据字符串中的数字。

字符串中数字顺序不一定相同的问题...

如何比较这两个字符串?

最佳答案

这是使用 purrr 的方法:

首先,我们使用purrr:map- 上的元素拆分为一个元素列表。然后,我们使用 purrr:map2 对列表执行 setdiff 以识别不同的元素。

如果两者的计算结果都为 "",那么我们知道它们是相同的,因此我们可以使用 case_when 来确定 is_equal 列.

然后我们可以通过删除列表列来清理。

library(dplyr)
library(purrr)
df %>%
mutate(comp_order_list = map(comp_order, ~str_split(.,"-", simplify = TRUE)),
comp_rec_list = map(comp_rec, ~str_split(.,"-", simplify = TRUE)),
elements_removed = map2_chr(comp_rec_list,comp_order_list,
~ paste(setdiff(.x,.y),collapse = "-")),
elements_added = map2_chr(comp_order_list,comp_rec_list,
~ paste(setdiff(.x,.y),collapse = "-")),
is_equal = case_when(elements_removed == "" & elements_added == "" ~ "yes",
TRUE ~ "no")) %>%
dplyr::select(order_id,user_id,comp_rec,comp_order,is_equal,elements_removed,elements_added)
# A tibble: 6 x 7
order_id user_id comp_rec comp_order is_equal elements_removed elements_added
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
1 1164320 32924 4-5-6-11-22-36-37 4-6-22-11-37-5 no "36" ""
2 1169182 33128 4-7-8-9-28-37-38 9-4-15-28-8-7 no "37-38" "15"
3 1166014 33003 4-5-6-22-27-36-37 27-22-4-6-5 no "36-37" ""
4 1166019 32996 4-6-8-22-27-36-38 27-22-4-6-8 no "36-38" ""
5 1166012 32922 27-22-4-6-8 27-22-4-6-8 yes "" ""
6 1166033 32911 27-22-4-6-8 27-22-4-6-8-33 no "" "33"

关于r - 比较 dplyr 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61958715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com