当名称在数据框中匹配时重命名命名向量
Rename a named vector when name has a match in dataframe
当名称在数据框中匹配时(尽管可以转换为列表),我想替换命名向量中的名称。在这里,我有一个名为 list1
的命名向量。然后,我有一个数据框 df
,其中 ID
与 list1
中的名称匹配,并且还有 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
我猜我可以使用 Map
或 setNames
或其他东西,但我不确定,因为我不常使用命名向量。我搜索了几个帖子,但找不到类似的问题。
简单
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
我们也可以使用enframe
和deframe
:
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
当名称在数据框中匹配时(尽管可以转换为列表),我想替换命名向量中的名称。在这里,我有一个名为 list1
的命名向量。然后,我有一个数据框 df
,其中 ID
与 list1
中的名称匹配,并且还有 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
我猜我可以使用 Map
或 setNames
或其他东西,但我不确定,因为我不常使用命名向量。我搜索了几个帖子,但找不到类似的问题。
简单
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
我们也可以使用enframe
和deframe
:
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