将数据框的两列转换为命名向量

Posted

技术标签:

【中文标题】将数据框的两列转换为命名向量【英文标题】: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")

【问题讨论】:

【参考方案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"

【讨论】:

以上是关于将数据框的两列转换为命名向量的主要内容,如果未能解决你的问题,请参考以下文章

python pandas dataframe:将函数返回元组分配给数据框的两列

尝试合并两个不同数据框的两列时出现问题?

如何将两列“计数”矩阵转换为 R 中的二进制向量? [复制]

如何使用点绘制熊猫数据框的两列

如何将两列csv转换为第二列的向量?

试图在r中隔离数据框中的两列[重复]