将数据框的两列转换为命名向量
Posted
技术标签:
【中文标题】将数据框的两列转换为命名向量【英文标题】:Converting two columns of a data frame to a named vector 【发布时间】:2013-10-16 09:46:25 【问题描述】:我需要将多行两列 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")
【问题讨论】:
【参考方案1】:使用names
函数:
whatyouwant <- as.character(dd$name)
names(whatyouwant) <- dd$crit
as.character
是必需的,因为data.frame
和read.table
将字符转换为具有默认设置的因子。
如果您想要单线:
whatyouwant <- setNames(as.character(dd$name), dd$crit)
【讨论】:
【参考方案2】:您可以从dd$name
创建一个向量,并使用names()
添加名称,但您可以使用structure()
一步完成:
whatiwant <- structure(as.character(dd$name), names = as.character(dd$crit))
【讨论】:
【参考方案3】:如需多样化,请尝试split
和unlist
:
unlist(split(as.character(dd$name), dd$crit))
# a b c d
# "Alpha" "Beta" "Caesar" "Doris"
【讨论】:
应该指出的是,这通过向重复名称附加一个数字来使重复名称唯一。对于大向量,它也不是很有效。【参考方案4】:您也可以为此使用deframe(x)
from the tibble package。
tibble::deframe()
它将第一列转换为名称,第二列转换为值。
【讨论】:
谢谢约翰!我很惊讶在使用 tidyverse 多年后,我仍然了解非常有用的功能。我希望我很久以前就知道这件事。我想我一直都是学生。 对于任何来此帖子询问反问题的人 - 如何将命名向量转换为两列数据框? - 答案是tibble::enframe()
跨度>
【参考方案5】:
这是一个非常通用、简单、整洁的方法:
library(dplyr)
iris %>%
pull(Sepal.Length, Species)
第一个参数是值,第二个参数是名称。
【讨论】:
非常整洁。一旦上线,可能会成为我的 goto。 应该是2021年的最佳答案【参考方案6】:通过the exposition pipe (%$%
) 也有一个magrittr
解决方案:
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"
。
【讨论】:
以上是关于将数据框的两列转换为命名向量的主要内容,如果未能解决你的问题,请参考以下文章
python pandas dataframe:将函数返回元组分配给数据框的两列