问题
I have a data frame that looks like this:
----------
index ID date Amount
2 1001 2010-06-08 0
21 1001 2010-10-08 10
6 1002 2010-08-16 30
5 1002 2010-11-25 20
9 1003 2010-01-01 0
8 1003 2011-03-06 10
12 1004 2012-03-12 10
11 1004 2012-06-21 10
15 1005 2010-01-01 30
13 1005 2010-04-06 20
I want to subset this data so that i have new data frames, one for each ID like this
index ID date Amount
2 1001 2010-06-08 0
21 1001 2010-10-08 10
and
6 1002 2010-08-16 30
5 1002 2010-11-25 20
and so on.
I dont need to save the new data frames, but use it to perform some basic calculations. Also i want to do this on my entire table consisting of more than 10000 IDs and hence the need for a loop. I tried this
temp <- data.frame(Numb=c(),Dt=c(),Amt=c())
for (i in seq_along(stNew$ID)){
temp[i,] <- subset(stNew, stNew[i,]==stNew$ID[i])
}
but that didnt work. Any suggestions? Thanks.
回答1:
may be like this
IDs<-unique(df$ID)
for (i in 1:length(IDs)){
temp <- df[df$ID==IDs[i],]
#more things to do with temp
}
回答2:
Take a look at the list2env and split function. Hereby some examples using the iris dataset.
two way:
list_df <- split(iris, iris$Species) #split the dataset into a list of datasets based on the value of iris$Species
list2env(list_DF, envir= .GlobalEnv) #split the list into separate datasets
one way:
list2env(split(iris, iris$Species), envir = .GlobalEnv)
Or you can assign custom names for the new datasets with a for
loop:
iris_split <- split(iris, iris$Species)
new_names <- c("one", "two", "three")
for (i in 1:length(iris_split)) {
assign(new_names[i], iris_split[[i]])
}
updates with examples
Related post
回答3:
iris_split <- split(iris, iris$Species)
Dynamically you can assign the data.frame name
new_names <- as.character(unique(iris$Species))
for (i in 1:length(iris_split)) {
assign(new_names[i], iris_split[[i]])
}
来源:https://stackoverflow.com/questions/19882085/subset-data-frame-in-r-using-loop