2013-11-09 247 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]]) 
    }