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

Ste*_*n F 45 r vector coercion dataframe

我需要将多行两列data.frame转换为命名字符向量.我data.frame会是这样的:

dd = data.frame(crit = c("a","b","c","d"), 
                name = c("Alpha", "Beta", "Caesar", "Doris")
                )
Run Code Online (Sandbox Code Playgroud)

我真正需要的是:

whatiwant = c("a" = "Alpha",
              "b" = "Beta",
              "c" = "Caesar",
              "d" = "Doris")
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 63

使用names功能:

whatyouwant <- as.character(dd$name)
names(whatyouwant) <- dd$crit
Run Code Online (Sandbox Code Playgroud)

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

如果你想要一个单行:

whatyouwant <- setNames(as.character(dd$name), dd$crit)
Run Code Online (Sandbox Code Playgroud)


ale*_*han 22

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

whatiwant <- structure(as.character(dd$name), names = as.character(dd$crit))
Run Code Online (Sandbox Code Playgroud)


Joh*_*ler 10

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

tibble::deframe()
Run Code Online (Sandbox Code Playgroud)

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

  • 对于任何来到这篇文章询问相反问题的人 - *如何将命​​名向量转换为两列数据框?* - 答案是 `tibble::enframe()` (8认同)
  • 谢谢约翰!令我惊讶的是,在使用 tidyverse 多年之后,我仍然了解如此有用的功能。我希望我很久以前就知道这一点。我想我永远都是一名学生。 (4认同)

use*_*745 8

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

library(dplyr)

iris %>%
  pull(Sepal.Length, Species)
Run Code Online (Sandbox Code Playgroud)

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

  • 应该是 2021 年的首要答案 (3认同)
  • 井井有条。一旦上线,可能会成为我的首选。 (2认同)

A5C*_*2T1 7

对于多样性,尝试splitunlist:

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