【问题标题】:Renaming list elements by key with dataframe使用数据框按键重命名列表元素
【发布时间】:2020-10-14 19:51:56
【问题描述】:

我有一个如下所示的列表:

$fec9
[1] "yes"

$`39c1`
[1] "no"

$d387
[1] "yes"

$`0065`
[1] "yes"

以及一个与列表元素具有匹配键的数据框:

dataframe <- data.frame(key = c('39c1', 'fec9', 'p731' '0065', 'd387'),
                        label = c('trash', 'wash car', 'cook dinner', 'mow lawn', 'vacuum'))

我正在尝试将列表中的每个元素重命名为相应键的标签,但数据框与列表的顺序不同,并且数据框中的某些键未出现在列表中。目前我正在尝试:

for(i in names(list)){
  names(list[i]) <- dataframe %>% filter(key == names(list[i])) %>% select(label)
}

但是,当我在名称全部保持不变后检查列表时

【问题讨论】:

    标签: r list dataframe key names


    【解决方案1】:

    我希望你正在寻找这个:

    #method 1
    #get common key from dataframe
    df <- df[df$key %in% names(list), ]
    list <- list[df$key] #getting the same order as of dataframe
    names(list) <- df$label
    
    #method 2
    #if you want to preserve the order of labels: 
    df <- df[df$key %in% names(list), ]
    row.names(df) <- df$key
    names(list) <- df[names(list), ]$label
    

    数据

    list <- list(fec9 = 'yes', `39c1` = 'no', 'd387' = 'yes', `0065` = 'yes')
    df <- data.frame(key = c('39c1', 'fec9', 'p731', '0065', 'd387'),  
                            label = c('trash', 'wash car', 'cook dinner', 'mow lawn', 'vacuum'), stringsAsFactors = FALSE)
    

    第二种方法的输出:

    $`wash car`
    [1] "yes"
    
    $trash
    [1] "no"
    
    $vacuum
    [1] "yes"
    
    $`mow lawn`
    [1] "yes"
    

    【讨论】:

      【解决方案2】:

      假设data.frame的列是character,那么我们得到'list'的namesintersecting元素和'key',并用它来分配list的值和对应的值'标签'

      nm1 <- intersect(names(list), dataframe$key)
      list[nm1] <- dataframe$label[dataframe$key %in% nm1]
      

      数据

      list <- list(fec9 = 'yes', `39c1` = 'no', 'd387' = 'yes', `0065` = 'yes')
      dataframe <- data.frame(key = c('39c1', 'fec9', 'p731', '0065', 'd387'),  
                 label = c('trash', 'wash car', 'cook dinner', 'mow lawn', 'vacuum'))
      

      【讨论】:

        【解决方案3】:

        这是使用merge + stack + setNames 的基本 R 选项

        with(
          merge(stack(lst), df, by.x = "ind", by.y = "key"),
          setNames(as.list(values), label)
        )
        

        给了

        $`mow lawn`
        [1] "yes"
        
        $trash
        [1] "no"
        
        $vacuum
        [1] "yes"
        
        $`wash car`
        [1] "yes"
        

        数据

        > dput(lst)
        list(fec9 = "yes", `39c1` = "no", d387 = "yes", `0065` = "yes")
        
        > dput(df)
        structure(list(key = c("39c1", "fec9", "p731", "0065", "d387"
        ), label = c("trash", "wash car", "cook dinner", "mow lawn",
        "vacuum")), class = "data.frame", row.names = c(NA, -5L))
        

        【讨论】:

          猜你喜欢
          • 2013-09-04
          • 2018-01-04
          • 2019-08-21
          • 2020-06-08
          • 1970-01-01
          • 2021-03-14
          • 2018-09-29
          • 1970-01-01
          • 2020-04-13
          相关资源
          最近更新 更多