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

97

我需要将一个多行两列的 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")
6个回答

94

使用 names 函数:

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

as.character是必须的,因为data.frameread.table使用默认设置将字符转换为因子。

如果你想要一行代码:

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

74

8
谢谢你,John!我很惊讶自己使用tidyverse多年后仍然能够学到如此有用的函数,真希望早些知道这个。我想我永远是一个学生。 - HowYaDoing
7
对于任何来到这篇帖子并提出相反问题的人——“如何将命名向量转换为两列数据框?”——答案是使用tibble::enframe()函数。 - acvill

30

这里有一种非常通用、简单、整洁的方法:

library(dplyr)

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

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


2
非常整洁。一旦上线,可能会成为我的首选。 - merv
2
应该是2021年的最佳答案。 - ChrKoenig

26

你可以从dd$name创建一个向量,并使用names()添加名称,但你可以使用structure()一次完成所有操作:

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

8

为了多样性,尝试使用splitunlist

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

1
应该指出的是,这通过在名称后附加数字使重复的名称变得唯一。对于大向量来说,这也不是非常高效的。 - Roland

3

同时也可以使用 magrittr 中的 展示管道符 (%$%) 来解决这个问题:

library(magrittr)

dd %$% set_names(as.character(name), crit)
tibble::deframe 的小优点在于,输入参数不一定需要是一个严格的二列框架/数据框(即避免 select(value_col, name_col) %>% 的操作)。
请注意,magrittr::set_namesbase::setNames 可以互换使用。我个人偏好前者,因为它与 "set_(col|row)?names" 相匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接