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

时间:2013-10-09 06:59:34

标签: r vector dataframe coercion

我需要将多行两列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 个答案:

答案 0 :(得分:56)

使用names功能:

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

as.character是必要的,因为data.frameread.table会将字符转换为默认设置的因素。

如果你想要一个单行:

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

答案 1 :(得分:20)

您可以使用dd$name制作一个向量,并使用names()添加名称,但您可以使用structure()一步完成所有操作:

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

答案 2 :(得分:6)

有关变种,请尝试splitunlist

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

答案 3 :(得分:3)

您也可以使用它。

tibble::deframe()

答案 4 :(得分:3)

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

library(magrittr)

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

tibble::deframe相比的次要优势是,不必将两列的框架/小节作为参数(即避免使用select(value_col, name_col) %>%)。

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

答案 5 :(得分:1)

这是一种非常通用的简便方法。目前,它可以通过github

获得dplyr的开发版本。
# devtools::install_github("tidyverse/dplyr") # dplyr_0.8.99.9003

# .rs.restartR() # Restart R session if dplyr was loaded before
library(dplyr)

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

(第一个参数是值,第二个参数是名称)