繁体   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