问题
Goal: Take a data frame and create separate vectors for each of its columns (variables).
The following code gets me close:
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))
}
It creates the a vector for each column in the data frame as shown by the output below:
> 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"
So far so good until you call one of the vectors. For example:
AB
[1] "hr$AB"
Alas, all that is created is a one element character vector. When what I want it to create is this...
> 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
...for each variable in the original data frame.
How do I get R to recognize the elements in the character vector "path" as objects to call in the assign function, rather than an individual character element to assign to the vector I'm creating? I would like to keep this within the loop frame work, since the main motivation behind this project is teach my self how to use loops.
Thanks!
回答1:
We have list2env
for this:
list2env(iris, .GlobalEnv)
head(Species)
#[1] setosa setosa setosa setosa setosa setosa
#Levels: setosa versicolor virginica
However, there is almost never a reason to pollute your workspace like that.
Edit:
Here is how you can do this with a loop:
var_names <- colnames(iris)
for(i in var_names) {
assign(i, iris[[i]])
}
Note that instead of creating your path
s I use [[
to access the data.frame columns. If you have a column name as a character vector, that (or [
) is the way to use this character to access the column.
回答2:
As @Roland mentions, you generally don't want to do that. Life is easier in the long run if you keep things together in lists, environments, or data frames.
A better approach is to learn how to use the with
, within
and related functions. These will temporarily attach a list, environment, or data frame to the beginning of the search path so that you can refer to the elements/columns directly by name:
> with(iris, head( Sepal.Width/Petal.Length ) )
[1] 2.500000 2.142857 2.461538 2.066667 2.571429 2.294118
These functions give you the convenience without polluting the global environment or search path.
来源:https://stackoverflow.com/questions/25750542/create-separate-vectors-for-each-of-a-data-frames-columns-variables