2013-11-14 58 views
0

在下面data.frame如何使用數據幀投3列

Date1 <- seq(from = as.POSIXct("2010-05-01 02:00"), 
      to = as.POSIXct("2010-05-01 06:00"), by = 3600) 
Dat <- data.frame(DateTime = Date1, 
        Temp = rnorm(length(Date1)), 
        height = c(1,2,3,4,5)) 
Dat2 <- data.frame(DateTime = Date1, 
        Temp = rnorm(length(Date1)), 
        height = c(1,2,3,4,5)) 

Dat3 <- rbind(Dat,Dat2) 

我想能夠使用投地重新構造data.frame讓我最終時間在第一列中,然後在其餘列中的溫度,其中高度值用於定義每個值進入哪一列。我看到投在重塑中使用了很多,但如果我嘗試

require(reshape) 
cast(Dat3,Temp ~ height) 

我收到一個錯誤

Using height as value column. Use the value argument to cast to override this choice 
Error in `[.data.frame`(data, , variables, drop = FALSE) : 
    undefined columns selected 

我能做些什麼來解決這個問題?

+5

呃......錯誤信息非常簡單。您的數據集包含變量「DateTime」,「x1」和「height」,但是您指的是一些不存在的名爲「Temp」的變量。 – A5C1D2H2I1M1N2O1R2T1

+0

我剛剛複製錯誤,請參閱編輯示例 – KatyB

+0

您能澄清所需的輸出並提供示例嗎? –

回答

1

編輯:

你可以嘗試reshape2

require(reshape2) 
dcast(Dat3,DateTime ~ height) 

我還編輯您的示例數據要清楚,(我的理解)

Date1 <- seq(from = as.POSIXct("2010-05-01 02:00"), 
      to = as.POSIXct("2010-05-01 06:00"), by = 3600) 

dat3<-data.frame(DateTime=Date1, Temp=rnorm(25),height=rep(c(1:5), each=5)) 

數據:

> dat3 
       DateTime  temp height 
1 2010-05-01 02:00:00 -0.1528124  1 
2 2010-05-01 03:00:00 -0.1212748  1 
3 2010-05-01 04:00:00 -0.3402005  1 
4 2010-05-01 05:00:00 -0.4789695  1 
5 2010-05-01 06:00:00 1.0711143  1 
6 2010-05-01 02:00:00 0.5340149  2 
7 2010-05-01 03:00:00 -0.6660925  2 
8 2010-05-01 04:00:00 2.6568830  2 
9 2010-05-01 05:00:00 -0.1686520  2 
10 2010-05-01 06:00:00 0.5323944  2 
11 2010-05-01 02:00:00 1.0419971  3 
12 2010-05-01 03:00:00 -1.2008618  3 
13 2010-05-01 04:00:00 1.3663645  3 
14 2010-05-01 05:00:00 -0.7694349  3 
15 2010-05-01 06:00:00 0.6992724  3 
16 2010-05-01 02:00:00 1.3105646  4 
17 2010-05-01 03:00:00 -0.9245039  4 
18 2010-05-01 04:00:00 -1.8716493  4 
19 2010-05-01 05:00:00 -1.2540669  4 
20 2010-05-01 06:00:00 0.2525718  4 
21 2010-05-01 02:00:00 -1.1807661  5 
22 2010-05-01 03:00:00 -0.8894825  5 
23 2010-05-01 04:00:00 -1.7290931  5 
24 2010-05-01 05:00:00 -0.5112744  5 
25 2010-05-01 06:00:00 -0.1841737  5 

代碼重塑

require(reshape2) 
dcast(dat3,DateTime ~ height, value.var="Temp") 

整形的數據

> dcast(dat3,DateTime ~ height, value.var="Temp") 
      DateTime   1   2   3   4   5 
1 2010-05-01 02:00:00 -0.1528124 0.5340149 1.0419971 1.3105646 -1.1807661 
2 2010-05-01 03:00:00 -0.1212748 -0.6660925 -1.2008618 -0.9245039 -0.8894825 
3 2010-05-01 04:00:00 -0.3402005 2.6568830 1.3663645 -1.8716493 -1.7290931 
4 2010-05-01 05:00:00 -0.4789695 -0.1686520 -0.7694349 -1.2540669 -0.5112744 
5 2010-05-01 06:00:00 1.0711143 0.5323944 0.6992724 0.2525718 -0.1841737 
+0

這是不可以做到的與演員?我收到警告消息使用height作爲值列:使用value.var來覆蓋。 缺少聚合函數:默認爲長度, – KatyB

+0

也許可以,但reshape2是改進版本,是的,你是正確的,你必須使用value.var =「Temp」,似乎你的數據在同一個日期時間有2個值和高度,所以它會默認爲長度 – Ananta

4

兩點:

  1. 您使用的是舊版本,已取代了 「reshape2」 包一包的。
  2. 如果有疑問,請嘗試明確指定一些函數參數,以幫助查看函數的工作方式。

對於第一點,請參閱其他答案。

對於第二點,你可以嘗試這樣的:

cast(Dat3, DateTime ~ height, value = "Temp", fun.aggregate = mean) 

(對於上述的類似「reshape2」版本,你可以使用dcast(Dat3, DateTime ~ height, value.var="Temp", fun.aggregate=mean)

讓我們打破這(也適用到另一個答案)。

  • 告訴cast(或最好是dcast)您正在使用什麼數據。
  • 指定一個formula,描述您想要作爲~左側的「固定」列(如ID變量)以及應成爲聚合值的列名稱的內容。
  • 指定value變量(或value.vardcast)作爲要在其上執行聚合的變量。
  • 指定您的聚合函數(默認情況下爲長度,在我的示例中爲mean)。

認爲這是cast發生因爲formula是如何解析和不同的變量是如何猜到了。在「重塑」,如果我沒有記錯,如果你通過代碼挖,如果未指定value參數,功能:

  • 試圖找到一個名爲「值」的變量,如果被發現,使用它作爲value參數。
  • 如果找不到,則使用data.frame中最後一列(最右側)的列作爲value列。
  • 如果最後一列碰巧已經在formula中命名 - 就像在您的示例中那樣 - 該列不適用於該函數用作value參數的值,所以您會收到此錯誤。

關於最後一點,「reshape2」不存在這個問題,你可以再使用變量多個參數。

要查看自己的代碼,類型castreshape1在與與加載的「reshape2」包提示的「重塑」包負載,以及dcastreshape2:::cast提示。您可能需要進一步挖掘,因爲這兩者都利用Hadley作爲軟件包一部分編寫的其他一些功能。