[英]change the values in a column of a dataframe using another dataframe that contains key pairs
我有以下示例 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
我们可以使用fuzzyjoin
library(fuzzyjoin)
regex_left_join(df, keypairs, by = 'old') %>%
transmute(old = old.x, new)
old new
1 412oldname1 newname1
2 32oldname132 newname1
3 oldname141 newname1
4 132oldname2 newname2
5 oldname3 <NA>
6 oldname4 <NA>
7 oldname5 <NA>
类似 Adam 的方法:
library(dplyr)
library(stringr)
library(tibble)
# or simply
# library(tidyverse)
df %>%
mutate(new = deframe(keypairs)[str_extract(old, paste(keypairs$old, collapse = "|"))])
这返回
old new
1 412oldname1 newname1
2 32oldname132 newname1
3 oldname141 newname1
4 132oldname2 newname2
5 oldname3 <NA>
6 oldname4 <NA>
7 oldname5 <NA>
这里会发生什么?
deframe(keypairs)
创建一个“查找”向量。 例如:如果我们将“oldname1”放入其中,则返回“newname1”。str_extract
提取查找的输入。 我们在old
列中搜索正确的“oldname”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.