2014-12-05 83 views
0

我試圖迭代循環通過一個R DF的子集,但我有一些麻煩。 df $ A包含0-1000的值。我想根據df $ A的每個唯一值對df進行子集化,處理這些數據,將其保存爲newdf,然後最終將1000個生成的newdf連接(rbind)爲一個df。在R中使用循環或lapply

我目前的單次迭代(無環路)的代碼是這樣的:

dfA = 1 
dfA_1 <- subset(df, A == dfA) 
:: some ddply commands on dfA_1 altering its length and content :: 

編輯:澄清,在單次迭代版本,一旦我有子集,我一直在使用ddply到再統計包含一些值的行數。並非所有子集都具有所有值,因此結果可以是可變長度的。因此,我一直將結果追加到一個框架df中,該框架說明了df的某個子集可能沒有包含我期望的值的任何行(即nrow = 0)的情況。理想情況下,我將每個A實例的子集定義爲固定長度。我如何將它合併到單個(或多個)plyr或dplyr代碼集中?

我對for循環的問題是,長度不是變量,而是df $ A的唯一值。

我的問題如下: 1.我將如何使用for循環(或某種形式的應用)來執行此操作? 2.除了生成迭代df名稱之外,還可以使用這些操作來操作數據(例如,名爲dfA_1的df將爲dfA_x,其中x是df $ A從1到1000之一的值之一)。我目前的想法是,我會然後綁定1000個dfA_x,儘管這看起來很麻煩。

非常感謝您的任何幫助。

+0

的'dplyr'答案是好的和現代的,但即使是普通的舊'plyr'取代了需要循環和應用。如果你正在爲'A'的每個級別做些什麼,那麼你'ddply(df,.variables =「A」,...)'。無需循環中的子集或任何這樣的廢話。 – Gregor 2014-12-05 19:46:14

+0

在base R中,你可以做類似'do.call(rbind,lapply(split(df,df $ A),function(sub.df){...}))''。你是什​​麼意思「改變它的長度和內容」? – jlhoward 2014-12-05 21:39:03

+0

目前,我一直在使用ddply來計算一些值的nrow,但由於並不是所有的子集都包含所有的值,我然後將結果附加到一個固定長度的骨架df上。我已經在上面的問題中添加了更多信息...請讓我知道是否不清楚。 – ucsbcoding 2014-12-06 00:47:10

回答