簡體   English   中英

使用另一個包含鍵對的數據框更改數據框列中的值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM