gpt4 book ai didi

r - 使用包含 key 对的另一个数据框更改数据框列中的值

转载 作者:行者123 更新时间:2023-12-05 09:30:20 24 4
gpt4 key购买 nike

我有以下样本 df

df <- data.frame(old=c("412oldname1","32oldname132","oldname141","132oldname2","oldname3","oldname4","oldname5"))

old
1 412oldname1
2 32oldname132
3 oldname141
4 132oldname2
5 oldname3
6 oldname4
7 oldname5

我想使用 grepl 提取行并替换。

keypairs <- data.frame(old=c("oldname1","oldname2"),new=c("newname1","newname2"))

old new
1 oldname1 newname1
2 oldname2 newname2

所需的数据框将是:

        old
1 newname1
2 newname1
3 newname1
4 newname2

理想情况下,我可以用模式替换 grepl 的输出,然后使用 left_join 并选择 new 列。

到目前为止,我有:

df %>% filter(grepl(keypairs$old,collapse="|"))
# still trying to figure out what to do at this step
%>% left_join(keypairs) %>% select(new)

最佳答案

可能有更有效的方法,但我以前用过类似的方法。

library(dplyr)
library(purrr)
library(stringr)

str_grab <- function(string, pattern) pattern[str_which(string, coll(pattern))[1]]

使用它来提取标准化名称。

df %>% 
mutate(clean = map_chr(old, str_grab, keypairs$old)) %>%
left_join(keypairs, by = c(clean = "old"))
# old clean new
# 1 412oldname1 oldname1 newname1
# 2 32oldname132 oldname1 newname1
# 3 oldname141 oldname1 newname1
# 4 132oldname2 oldname2 newname2
# 5 oldname3 <NA> <NA>
# 6 oldname4 <NA> <NA>
# 7 oldname5 <NA> <NA>

如果您只想保留匹配的,请使用 inner_join() 而不是 left_join()。然后您可以使用基本的 dplyr 命令重命名和选择您想要的列。

df %>% 
mutate(clean = map_chr(old, str_grab, keypairs$old)) %>%
inner_join(keypairs, by = c(clean = "old")) %>%
select(old = new)
# old
# 1 newname1
# 2 newname1
# 3 newname1
# 4 newname2

正如所怀疑的那样,有一种更有效的方法。以下是所提出方法的一些基准。

Martin Gal 提供的方法在执行时间和代码行数方面要高效得多。

Unit: milliseconds
expr min lq mean median uq max neval
method_adam() 7.1371 7.68660 8.706662 8.03725 8.54810 16.5197 100
method_martin() 1.1090 1.21125 1.464750 1.29145 1.42950 7.1925 100
method_akrun() 25.4143 26.72945 29.400662 27.64135 32.21115 50.5500 100

关于r - 使用包含 key 对的另一个数据框更改数据框列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69691452/

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