根据列表名称变异向量

Posted

技术标签:

【中文标题】根据列表名称变异向量【英文标题】:Mutate vector according to list names 【发布时间】:2022-01-07 11:54:39 【问题描述】:

抱歉,如果在其他地方问过这个问题,但我找不到它。我有一个带有字符向量的数据框,比如说

library(tidyverse)

mydf <- data.frame(value = c('c','e','a','d')) 

还有一个列表,名称与mydf中的字符向量value不完全对应

    mylist <- list ('a' = '1',
                    'b' = '2',
                    'c' = '3',
                    'd' = '4')

如果value 等于给定列表项的名称,我如何在mydf 中定义一个新变量以获取列表中项的元素?

换句话说,期望的输出是

mydf2 <- data.frame(value = c('c','e','a','d'),
                    value2 = c('3', 'e', '1', '4')) 

我认为这可以通过 case_when 和可能的 bang-bang 符号来完成,但我不能完全平方它。

【问题讨论】:

【参考方案1】:

unlistlist 并使用命名向量到match 并替换“值”列中的值,然后用coalesce 将不匹配的即NA 替换为原始列值

library(dplyr)
mydf3 <- mydf %>%
    mutate(value2 = coalesce(unlist(mylist)[value], value))

-输出

mydf3
  value value2
1     c      3
2     e      e
3     a      1
4     d      4

或者另一种选择是将命名的list 转换为两列data.frame (stack) 之后的连接,然后使用coalescecase_when/ifelse

mydf %>% 
   left_join(stack(mylist), by = c("value"= "ind")) %>% 
   transmute(value, value2 =  case_when(is.na(values) ~ value, TRUE ~ values))
  value value2
1     c      3
2     e      e
3     a      1
4     d      4

【讨论】:

以上是关于根据列表名称变异向量的主要内容,如果未能解决你的问题,请参考以下文章

ORA-04091: 表名正在变异

数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

R语言unlist函数将复杂数据(list列表dataframe字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)

使用列名称向量减少列表

根据包含的类型检索向量的向量

SQL 查询某字段数据所在的表