我需要将多行两列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")
答案 0 :(得分:56)
使用names
功能:
whatyouwant <- as.character(dd$name)
names(whatyouwant) <- dd$crit
as.character
是必要的,因为data.frame
和read.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)
有关变种,请尝试split
和unlist
:
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_names
与base::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)
(第一个参数是值,第二个参数是名称)