2013-11-09 122 views
3

我有一个数据帧,看起来像这样:子集数据帧使用循环

---------- 

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 

我想,这样我有新的数据帧,一个用于这样

每个ID子集这个数据
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 

等。

我不需要保存新的数据帧,但使用它来执行一些基本的计算。另外我想在我的整个表上做这个超过10000个ID,因此需要一个循环。我试过这个

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

但这没有奏效。有什么建议么?谢谢。

+2

您好,欢迎来SO!我自发的建议是,你应该尝试搜索SO(和其他地方)的答案。在数据框中对每个组执行某些操作是SO上最常见的问题之一,您一定会找到一些可以适应您自己的数据的很好的答案。 [This](http://stackoverflow.com/questions/3505701/r-grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs-by-vs-aggrega)and [this](http ://lamages.blogspot.se/2012/01/say-it-in-r-with-by-apply-and-friends.html)可能会让你开始。干杯。 – Henrik

+0

Henrik - 谢谢。事实上,我通过搜索,发现了一对非常有用的情侣。感谢您的链接。 –

+0

太棒了!因此,不需要分割或子集数据框。 – Henrik

回答

6

可能是这样

IDs<-unique(df$ID) 
    for (i in 1:length(IDs)){ 
    temp <- df[df$ID==IDs[i],] 
    #more things to do with temp 
    } 
3

看看的list2envsplit功能。以下是使用虹膜数据集的一些示例。

双向的:

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 

一个办法:

list2env(split(iris, iris$Species), envir = .GlobalEnv) 

或者你可以用for循环分配新的数据集的自定义名称:

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

举例更新

Related post

2
iris_split <- split(iris, iris$Species) 

动态,您可分配data.frame名

new_names <- as.character(unique(iris$Species)) 

    for (i in 1:length(iris_split)) { 
    assign(new_names[i], iris_split[[i]]) 
    }