2012-04-23 72 views
0

我的大部分問題都是如何提取和組織數據,沒有事先培訓,我爲我無法清楚表達我想要的內容而道歉。我希望我甚至能夠知道如何用文字或在線閱讀文章。這裏是我的問題現在:如何在r中對子集和組進行循環?

我有一個信息數據框有一個唯一的組ID爲ID,有153個唯一的ID,但我有來自這些組的信息> 6000行。

我想要做的是每次從2組中獲取所有信息,並寫出一個包含所有相關信息的簡單csv文件。如果整體個體數量爲奇數(n = 153),那麼這將如何工作。

我想是這樣的:

IDs = unique(dat$ID) 
for (i in length(IDs)){ 
    IDgp = subset(dat, dat$ID==IDs[i] & dat$ID==IDs[i+1]) 
    write.csv(IDgp, paste(IDgp[i],".csv") 
    i = i+2 
    } 

這不工作,我不知道如何得到它來增加下一個「組2」。我知道,循環笨重,我曾想過也許ddply可能工作,甚至是一個命令而不是子集。由於在R中有很多方法可以做事,我不知道甚至可以稱之爲我想做的事情。我想我有辦法讓它變得複雜。

我一直在尋找答案,並將其作爲可能性發現,但不知道如何讓它一次寫入超過1組的信息,而且我不清楚函數(x)命令正在做:

d_ply(dat, "ID", function(x) 
    write.csv(x[i], file = paste(x$ID[i], ".csv") 
    , row.names = FALSE)) 
+0

您是否需要將所有可能的組標識對的數據保存在不同的文件中? – DrDom 2012-04-23 19:14:14

+0

我可能不會這樣做,但你可以使用while循環代替。 – 2012-04-23 19:15:08

+0

@DrDom不,不是所有可能的對,只是按順序依次處理列表 - 生成一個文件,其中包含來自組1和2的信息,然後是來自組3和4的文件,然後是來自5和6的文件。 – Kerry 2012-04-23 19:17:51

回答

1

也許這可以幫助。但我認爲有一個更優雅的方式來做到這一點。

IDs = unique(dat$ID) 
for (i in seq(1, length(IDs), 2)){ 
    write.csv(dat[dat$ID %in% IDs[i+c(0,1)], ], 
    paste(IDs[i], "_", IDs[i+1], ".csv", sep="")) 
} 

編輯爲ID的

+0

應該粘貼(IDgp [i]'粘貼(ID [i]'或者可能'粘貼(ID [i],ID [i + 1]'?(ps某種程度上我的編輯沒有被保存 - 對不起第二次嘗試) – BenBarnes 2012-04-23 19:37:09

+0

是的,真的!我只是複製粘貼的原始代碼。感謝您的更正。 – DrDom 2012-04-23 19:39:35

+0

@DrDom當我運行這個腳本時,這些文件是空的,它們的標題是正確的命名法,但nadda是數據。 – Kerry 2012-04-23 19:49:36

1

下面是建立從你的ID的合適維度的矩陣,再一個辦法全長創建順序依次通過它們:

dat <- data.frame(id = 1:10, foo = runif(10)) 
#This will throw a warning if dimensions don't line up, not sure what you want to do with those 
idpairs <- matrix(sort(unique(dat$id)), ncol = 2, byrow = TRUE) 
> head(idpairs,2) 
    [,1] [,2] 
[1,] 1 2 
[2,] 3 4 
a_ply(idpairs, 1, function(x) print(dat[dat$id %in% x,])) 

你」 d明顯地將上面的print函數替換爲適合您需要的任何內容。