81

我需要将多行两列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")
4

6 回答 6

80

使用names功能:

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

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

如果你想要一个单行:

whatyouwant <- setNames(as.character(dd$name), dd$crit)
于 2013-10-09T07:12:51.263 回答
46

您也可以deframe(x)tibble中使用它。

tibble::deframe()

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

于 2019-06-06T14:20:09.020 回答
24

您可以从 制作矢量dd$name,并使用 添加名称names(),但您可以通过以下方式一步完成所有操作structure()

whatiwant <- structure(as.character(dd$name), names = as.character(dd$crit))
于 2013-10-09T07:13:12.203 回答
15

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

library(dplyr)

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

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

于 2020-04-28T11:00:50.447 回答
8

对于品种,尝试splitunlist

unlist(split(as.character(dd$name), dd$crit))
#        a        b        c        d 
#  "Alpha"   "Beta" "Caesar"  "Doris" 
于 2013-10-09T07:15:03.660 回答
3

通过展示管道 ( )也可以magrittr解决此问题:%$%

library(magrittr)

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

次要优势tibble::deframe在于,不必将两列框架/小标题作为参数(即避免 a select(value_col, name_col) %>%)。

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

于 2020-05-19T03:05:20.840 回答