【问题标题】:Converting two columns of a data frame to a named vector将数据框的两列转换为命名向量
【发布时间】:2013-10-16 09:46:25
【问题描述】:

我需要将多行两列 data.frame 转换为命名字符向量。 我的data.frame 是这样的:

dd = data.frame(crit = c("a","b","c","d"), 
                name = c("Alpha", "Beta", "Caesar", "Doris")
                )

而我真正需要的是:

whatiwant = c("a" = "Alpha",
              "b" = "Beta",
              "c" = "Caesar",
              "d" = "Doris")

【问题讨论】:

    标签: r vector dataframe coercion


    【解决方案1】:

    使用names函数:

    whatyouwant <- as.character(dd$name)
    names(whatyouwant) <- dd$crit
    

    as.character 是必需的,因为data.frameread.table 将字符转换为具有默认设置的因子。

    如果您想要单线:

    whatyouwant <- setNames(as.character(dd$name), dd$crit)
    

    【讨论】:

      【解决方案2】:

      您可以从dd$name 创建一个向量,并使用names() 添加名称,但您可以使用structure() 一步完成:

      whatiwant <- structure(as.character(dd$name), names = as.character(dd$crit))
      

      【讨论】:

        【解决方案3】:

        如需多样化,请尝试splitunlist

        unlist(split(as.character(dd$name), dd$crit))
        #        a        b        c        d 
        #  "Alpha"   "Beta" "Caesar"  "Doris" 
        

        【讨论】:

        • 应该指出的是,这通过向重复名称附加一个数字来使重复名称唯一。对于大向量,它也不是很有效。
        【解决方案4】:

        您也可以为此使用deframe(x) from the tibble package

        tibble::deframe()
        

        它将第一列转换为名称,第二列转换为值。

        【讨论】:

        • 谢谢约翰!我很惊讶在使用 tidyverse 多年后,我仍然了解非常有用的功能。我希望我很久以前就知道这件事。我想我一直都是学生。
        • 对于任何来此帖子询问反问题的人 - 如何将命名向量转换为两列数据框? - 答案是 tibble::enframe()跨度>
        【解决方案5】:

        这是一个非常通用、简单、整洁的方法:

        library(dplyr)
        
        iris %>%
          pull(Sepal.Length, Species)
        

        第一个参数是值,第二个参数是名称。

        【讨论】:

        • 非常整洁。一旦上线,可能会成为我的 goto。
        • 应该是2021年的最佳答案
        【解决方案6】:

        通过the exposition pipe (%$%) 也有一个magrittr 解决方案:

        library(magrittr)
        
        dd %$% set_names(as.character(name), crit)
        

        tibble::deframe 相比的次要优势在于,不必将两列框架/小标题作为参数(即避免使用select(value_col, name_col) %&gt;%)。

        请注意,magrittr::set_namesbase::setNames 是可互换的。我只是更喜欢前者,因为它匹配"set_(col|row)?names"

        【讨论】:

          猜你喜欢
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多