【问题标题】:Create separate vectors for each of a data frame's columns (variables)为数据框的每个列(变量)创建单独的向量
【发布时间】:2014-11-03 05:22:52
【问题描述】:

目标:获取一个数据框并为其每一列(变量)创建单独的向量。

下面的代码让我很接近:

batting <- read.csv("mlb_2014.csv", header = TRUE, sep = ",")
hr <- batting[(batting$HR >= 20 & batting$PA >= 100), ]
var_names <- colnames(hr)
for(i in var_names) {
path <- paste("hr$", i, sep = "")
assign(i, as.vector(path))
}

它为数据框中的每一列创建一个向量,如下面的输出所示:

> ls()
 [1] "AB"          "Age"         "BA"          "batting"     "BB"          "CS"         
 [7] "G"           "GDP"         "H"           "HBP"         "hr"          "HR"         
 [13] "i"           "IBB"         "Lg"          "Name"        "OBP"         "OPS"        
 [19] "OPS."        "PA"          "path"        "Pos.Summary" "R"           "RBI"        
 [25] "SB"          "SF"          "SH"          "SLG"         "SO"          "TB"         
 [31] "Tm"          "var_names"   "X2B"         "X3B"        

到目前为止一切顺利,直到您调用其中一个向量。例如:

AB
[1] "hr$AB"

唉,所创建的只是一个单元素字符向量。当我想要它创建的是这个......

> AB <- as.vector(hr$AB)
> AB
[1] 459 456 506 417 492 496 404 430 497 346 494 501 415 370 500 331 501 539 456 443 316 437
[23] 449 526 349 486 432 480 295 489 354 506 315 471

...对于原始数据框中的每个变量。

如何让 R 将字符向量“路径”中的元素识别为要在分配函数中调用的对象,而不是分配给我正在创建的向量的单个字符元素?我想将其保留在循环框架内,因为该项目背后的主要动机是自学如何使用循环。

谢谢!

【问题讨论】:

  • 欢迎来到 StackOverflow!我可以帮你解决这个问题。为了将来参考,您最好使用内置的、易于重现的数据集之一来询问您的问题,而不是参考诸如 .csv 之类的文件。不用担心。
  • 理想的答案是(1)帮助您了解如何使用循环,还是(2)回答您关于如何从字符向量获取向量的问题?
  • 你能解释一下为什么你想这样做吗?这在 R 中是不寻常的事情。如果你想在交互模式下节省一些输入,那么你可以使用attach() 来做到这一点 - 但请注意,一些 R 程序员对此并不满意。
  • Hi Hack-R:我会记得以后使用内置数据集。对不起!
  • 嗨安德烈:我知道这很不寻常。老实说,我只是在玩 R 并试图找到与 for 循环有关的东西。这似乎应该适合这种方法,我有点沮丧,因为我无法让它发挥作用。所以我想这比实际更迂腐。

标签: r for-loop vector dataframe


【解决方案1】:

为此我们有list2env

list2env(iris, .GlobalEnv)
head(Species)
#[1] setosa setosa setosa setosa setosa setosa
#Levels: setosa versicolor virginica

但是,几乎没有理由像那样污染您的工作空间。

编辑:

以下是如何使用循环执行此操作:

var_names <- colnames(iris)
for(i in var_names) {
  assign(i, iris[[i]])
}

请注意,我没有创建 paths,而是使用 [[ 来访问 data.frame 列。如果您有一个列名作为字符向量,那么(或[)就是使用该字符访问该列的方式。

【讨论】:

  • 啊,是的!我根本没有想到要在分配函数中设置子集。十分优雅。谢谢。
【解决方案2】:

正如@Roland 所提到的,您通常不想这样做。从长远来看,如果将事物放在列表、环境或数据框中,生活会更轻松。

更好的方法是学习如何使用withwithin 和相关函数。这些将临时将列表、环境或数据框附加到搜索路径的开头,以便您可以直接按名称引用元素/列:

> with(iris, head( Sepal.Width/Petal.Length ) )
[1] 2.500000 2.142857 2.461538 2.066667 2.571429 2.294118

这些功能在不污染全局环境或搜索路径的情况下为您提供便利。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2021-09-29
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多