【问题标题】: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 符号来完成,但我不能完全平方它。

【问题讨论】:

    标签: r list dplyr


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2020-02-04
      • 2021-05-13
      • 1970-01-01
      • 2014-03-15
      • 2020-10-18
      • 2021-12-29
      相关资源
      最近更新 更多