将数据框列拆分为 R 中的向量
Posted
技术标签:
【中文标题】将数据框列拆分为 R 中的向量【英文标题】:Split dataframe columns into vectors in R 【发布时间】:2021-12-29 15:41:19 【问题描述】:我有一个这样的数据框:
Number <- c(1,2,3)
Number2 <- c(10,12,14)
Letter <- c("A","B","C")
df <- data.frame(Number,Number2,Letter)
我想将 df 拆分为各自的三列,每一列都成为具有各自列名的向量。本质上,输出应该看起来与上面示例中的原始三个输入向量完全相同。
我尝试了 split 功能,也使用了 for 循环,但没有成功。
有什么想法吗?谢谢。
【问题讨论】:
【参考方案1】:我们可以使用unclass
,因为data.frame
是带有附加属性的list
。通过unclass
ing,它删除了data.frame
属性
unclass(df)
或者另一个选项是asplit
,MARGIN
指定为 2
asplit(df, 2)
注意:它们都返回 named
list
。如果我们打算在全局环境中创建新对象,请使用list2env
(虽然不推荐)
【讨论】:
谢谢。这很好用。不过,我如何将列表中的参数放入我的环境中的单独向量中? @jestor 正如我提到的list2env
和list2env(df, .GlobalEnv)
,不推荐这样做,因为它会在全局环境中创建大量对象【参考方案2】:
我们可以使用c
或as.list
> c(df)
$Number
[1] 1 2 3
$Number2
[1] 10 12 14
$Letter
[1] "A" "B" "C"
> as.list(df)
$Number
[1] 1 2 3
$Number2
[1] 10 12 14
$Letter
[1] "A" "B" "C"
【讨论】:
【参考方案3】:假设您在全局环境中尝试将这些创建为向量,请使用list2env
:
df <- data.frame(Number = c(1, 2, 3),
Number2 = c(10, 12, 14),
Letter = c("A", "B", "C"))
list2env(df, .GlobalEnv)
## <environment: R_GlobalEnv>
ls()
## [1] "df" "Letter" "Number" "Number2"
【讨论】:
【参考方案4】:list2env 显然是最简单的方法,但如果你想用 for 循环来做也可以实现。
“棘手”的部分是根据 for 循环内的列名创建一个新向量。如果你只是写
names(df[i]) <- input
不会创建向量。
一种解决方法是使用粘贴创建一个带有新向量名称的字符串以及其中应包含的内容,然后使用“eval(parse(text=)”来评估此表达式。
也许不是最优雅的解决方案,但似乎可行。
for (i in colnames(df))
vector_name <- names(df[i])
expression_to_be_evaluated <- paste(vector_name, "<- df[[i]]")
eval(parse(text=expression_to_be_evaluated))
> Letter
[1] A B C
Levels: A B C
> Number
[1] 1 2 3
> Number2
[1] 10 12 14
【讨论】:
以上是关于将数据框列拆分为 R 中的向量的主要内容,如果未能解决你的问题,请参考以下文章