将数据框列拆分为 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。通过unclassing,它删除了data.frame 属性

unclass(df)

或者另一个选项是asplitMARGIN 指定为 2

asplit(df, 2)

注意:它们都返回 named list。如果我们打算在全局环境中创建新对象,请使用list2env(虽然不推荐)

【讨论】:

谢谢。这很好用。不过,我如何将列表中的参数放入我的环境中的单独向量中? @jestor 正如我提到的list2envlist2env(df, .GlobalEnv),不推荐这样做,因为它会在全局环境中创建大量对象【参考方案2】:

我们可以使用cas.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 中的向量的主要内容,如果未能解决你的问题,请参考以下文章

使用R函数将数据框列中的字符串替换为“”

熊猫数据框列和行中的拆分列表

在 Spark 中将数据框列转换为向量

基于存储为R w / dplyr mutate()中的向量的列索引连接data.frame字符列?

迭代获取数据框列的最大值,加一并重复 r 中的所有行

将熊猫数据框列列表值拆分为重复行[重复]