当名称在数据框中匹配时重命名命名向量

Rename a named vector when name has a match in dataframe

当名称在数据框中匹配时(尽管可以转换为列表),我想替换命名向量中的名称。在这里,我有一个名为 list1 的命名向量。然后,我有一个数据框 df,其中 IDlist1 中的名称匹配,并且还有 new_name 我想替换为 [=12] 中的名称=].

数据

list1 <- c(`3381` = 0.17492310894803, `3385` = 0.114350865502778, `3389` = 0.0761515760913618, 
`3391` = 0.102018929027825, `3395` = 0.14140280849757, `3397` = 0.136809180022465
)

#      3381       3385       3389       3391       3395       3397 
#0.17492311 0.11435087 0.07615158 0.10201893 0.14140281 0.13680918 


df <- structure(list(ID = c(3389L, 3397L, 3391L, 3385L, 3381L, 3395L, 
4400L), new_name = c(163, 429, 223, 49, 3, 360, 250)), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

#     ID new_name
#  <int>    <dbl>
#1  3389      163
#2  3397      429
#3  3391      223
#4  3385       49
#5  3381        3
#6  3395      360
#7  4400      250

预期输出

output <-c(`3` = 0.17492310894803, `49` = 0.114350865502778, `163` = 0.0761515760913618, 
          `223` = 0.102018929027825, `360` = 0.14140280849757, `429` = 0.136809180022465)

#         3         49        163        223        360        429 
#0.17492311 0.11435087 0.07615158 0.10201893 0.14140281 0.13680918 

我猜我可以使用 MapsetNames 或其他东西,但我不确定,因为我不常使用命名向量。我搜索了几个帖子,但找不到类似的问题。

简单

names(list1)=df$new_name[match(names(list1),df$ID)]

         3         49        163        223        360        429 
0.17492311 0.11435087 0.07615158 0.10201893 0.14140281 0.13680918

我们也可以使用enframedeframe:

library(tidyverse)

enframe(list1) %>% 
  mutate(name = ifelse(name %in% df$ID, deframe(df)[name], name)) %>% 
  deframe

#         3         49        163        223        360        429 
#0.17492311 0.11435087 0.07615158 0.10201893 0.14140281 0.13680918 

另一种选择是 left_join,然后 select 正确的列并再次使用 deframe

enframe(list1) %>%
  mutate(name = as.numeric(name)) %>%
  left_join(., df, by = c(name = "ID")) %>%
  select(new_name, value) %>%
  deframe