2010-02-24 93 views
3

我有一個名爲series_to_plot.df的數據框,它是通過將多個其他data.frames組合在一起創建的(如下所示)。我現在想要從每個這些中拉出.mm列,以便我可以繪製它們。所以我想拉出每個data.frame的第三列(例如p3c3.mm,p3c4.mm等),但是我看不到如何爲對象中的所有data.frames執行此操作,而無需循環名字。這可能嗎?如何引用data.frame中的data.frame的列?

我只能拉出一套:例如series_to_plot.df [[3]]和另一個由 series_to_plot.df [[10]](所以它只是一個向量列表..),我可以直接引用series_to_plot.df $ p3c3.mm,但有沒有命令從每個data.frame獲取包含所有mm的矢量?我期待指數是這樣工作的:series_to_plot.df [3 [3],但它返回[.data.frame錯誤(series_to_plot.df,3 [3]):未定義列中選擇

series_to_plot.df 
      p3c3.rd   p3c3.day p3c3.mm  p3c3.sd     p3c3.n p3c3.noo p3c3.no_NAs 
    1  2010-01-04    0 0.1702531 0.04003364    7    1   0 
    2  2010-01-06    2 0.1790594 0.04696674    7    1   0 
    3  2010-01-09    5 0.1720404 0.03801756    8    0   0 

      p3c4.rd   p3c4.day p3c4.mm  p3c4.sd     p3c4.n p3c4.noo p3c4.no_NAs 
    1  2010-01-04    0 0.1076581 0.006542157    6    2   0 
    2  2010-01-06    2 0.1393447 0.066758781    7    1   0 
    3  2010-01-09    5 0.2056846 0.047722862    7    1   0 

      p3c5.rd   p3c5.day p3c5.mm  p3c5.sd     p3c5.n p3c5.noo p3c5.no_NAs 
    1  2010-01-04    0 0.07987147 0.006508766    7    1   0 
    2  2010-01-06    2 0.11496167 0.046478767    8    0   0 
    3  2010-01-09    5 0.40326471 0.210217097    7    1   0 
+0

你確定series_to_plot.df是一個數據框嗎?當我讀你的評論,看看輸出,我想知道它是一個列表或向量包含一些數據幀。我不知道爲什麼你的輸出每3行顯示列標題,行號重新開始。測試結構run str(series_to_plot.df) – 2010-02-24 20:52:40

+0

謝謝,是的,它是一個data.frame,它是另一個data.frame內的一組data.frames。但是你是正確的,這不是最好的數據結構,我在這裏找到了最好的結構的一些提示:http:// stackoverflow。com/questions/1181060/reshaping-time-series-data-from-wide-to-tall-format-for-plotting – John 2010-02-25 23:27:06

回答

2

要添加到其他的答案,我不認爲這是在變量名編碼的有用信息是個好主意。更好地重新排列數據,以便所有有用的信息都在某個變量的值中。我不知道有足夠的瞭解您的數據集的建議正確的格式,但它可能是這樣的

p c   rd day date mm sd ... 
3 3 2010-10-04 ... 

一旦你完成這個回答你的問題變得簡單df$mm

如果從外部源獲得在一個不太有用的形式的數據,可以R內使用reshape功能或功能從reshape包重新排列它在一個更有用的形式,如上述。

+0

我也試過在我的回答中提出它,但我認爲'pxcy'是部分data.frame(即rbind/cbind的東西)的名稱。但是您的提示將新名稱的部分名稱包含在新列中非常好。 – Marek 2010-02-25 08:37:07

+0

謝謝,我會嘗試融化和重塑...(另請參閱http://stackoverflow.com/questions/1181060/reshaping-time-series-data-from-wide-to-tall-format-for-plotting) – John 2010-02-25 23:29:41

4

要獲得與指定名稱的所有列,你可以這樣做:

names_with_mm <- grep("mm$", names(series_to_plot.df), value=TRUE) 
series_to_plot.df[, names_with_mm] 

但是,如果你的基礎data.frame的所有具有相同的結構,那麼你可以rbind他們,是這樣的:

series_to_plot.df <- rbind(
    cbind(name="p3c3", p3c3), 
    cbind(name="p3c4", p3c4), 
    cbind(name="p3c5", p3c5) 
) 

Then mm values are in one column and it easily to plot。

1

R Language Definition有一些關於索引的很好的信息(sec 3.4.1),這很有幫助。

然後,您可以使用grep()命令來拉取與序列匹配的名稱。然後串它一起這樣的:

dataWithMM <- series_to_plot.df[,grep("[P]", names(series_to_plot.df))] 

解構了一點,這得到匹配「毫米」模式的列數:

namesThatMatch <- grep("[mm]", names(series_to_plot.df) 

然後我們使用該列表來調用列,我們希望:

dataWithMM <- series_to_plot.df[, namesThatMatch ] 
+0

Marek的答案比我的更好的正則表達式。 「[mm]」將與任何地方的「mm」列匹配。 「mm $」只會匹配以「mm」結尾的列,這可能更合適。 – 2010-02-24 20:49:34