为每个数据框的列(变量)创建单独的向量

时间:2014-09-09 17:23:43

标签: r for-loop vector dataframe

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

以下代码让我接近:

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识别字符向量中的元素&#34; path&#34;作为在assign函数中调用的对象,而不是分配给我创建的向量的单个字符元素?我想把它保留在循环框架的工作中,因为这个项目背后的主要动机是教我自己如何使用循环。

谢谢!

2 个答案:

答案 0 :(得分:4)

我们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]])
}

请注意,我不是创建path,而是使用[[来访问data.frame列。如果您将列名称作为字符向量,那么(或[)是使用此字符访问列的方式。

答案 1 :(得分:1)

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

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

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

这些功能可为您提供便利,而不会污染全局环境或搜索路径。