将数据帧列拆分为 R 中的向量
Split dataframe columns into vectors in R
我有这样一个数据框:
Number <- c(1,2,3)
Number2 <- c(10,12,14)
Letter <- c("A","B","C")
df <- data.frame(Number,Number2,Letter)
我想将 df 拆分为各自的三列,每一列都成为具有各自列名的向量。本质上,输出应该与上例中的原始三个输入向量完全一样。
我尝试了 split 函数,也尝试了 for 循环 ,但没有成功。
有什么想法吗?谢谢。
我们可以使用 unclass
,因为 data.frame
是具有附加属性的 list
。通过 unclass
ing,它删除了 data.frame
属性
unclass(df)
或者另一个选项是 asplit
,其中 MARGIN
指定为 2
asplit(df, 2)
注意:他们两个 return 一个 named
list
。如果我们打算在全局环境中创建新对象,请使用 list2env
(尽管不推荐)
我们可以使用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"
假设您尝试将这些创建为全局环境中的向量,请使用 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"
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
我有这样一个数据框:
Number <- c(1,2,3)
Number2 <- c(10,12,14)
Letter <- c("A","B","C")
df <- data.frame(Number,Number2,Letter)
我想将 df 拆分为各自的三列,每一列都成为具有各自列名的向量。本质上,输出应该与上例中的原始三个输入向量完全一样。
我尝试了 split 函数,也尝试了 for 循环 ,但没有成功。
有什么想法吗?谢谢。
我们可以使用 unclass
,因为 data.frame
是具有附加属性的 list
。通过 unclass
ing,它删除了 data.frame
属性
unclass(df)
或者另一个选项是 asplit
,其中 MARGIN
指定为 2
asplit(df, 2)
注意:他们两个 return 一个 named
list
。如果我们打算在全局环境中创建新对象,请使用 list2env
(尽管不推荐)
我们可以使用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"
假设您尝试将这些创建为全局环境中的向量,请使用 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"
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