[英]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.