2015-11-26 21 views
0

這裏下面是代碼:如何將嵌入數據更改爲數據框中的「平坦」。

exam.d <- data.frame(seq.no=c(2,3,4,2,3,4,2,3,4,2,3,4), 
          pd.no=c(100,100,100,200,200,200,300,300,300,400,400,400), 
          value=100:111) 

    f <- function(a){ 
    a/(a[1]+a[2])*2 
    } 

    d <- aggregate(value~pd.no,data=exam.d, f) 

> d 
    pd.no value.1 value.2 value.3 
1 100 0.9950249 1.0049751 1.0149254 
2 200 0.9951691 1.0048309 1.0144928 
3 300 0.9953052 1.0046948 1.0140845 
4 400 0.9954338 1.0045662 1.0136986 

所以,我要融化d,以使今後的工作,但我得到了一個錯誤信息:

> melt(d, id="pd.no") 
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : 
    dims [product 12] do not match the length of object [4] 

我查了D的信息,後來我才知道爲什麼。該值1,值2,值3是不是D的數據幀一個「真實」的元素,但所謂的「價值」是:

> str(d) 
'data.frame': 4 obs. of 2 variables: 
$ pd.no: num 100 200 300 400 
$ value: num [1:4, 1:3] 0.995 0.995 0.995 0.995 1.005 ... 

爲了解決我的問題,我可以繞過使用d $值的情況。但我想知道,如果我想獲得這樣的數據框而沒有「價值」,並且可以通過d $ value1,d $ value2 ...獲取數據,那該怎麼做?

> d 
    pd.no value.1 value.2 value.3 
1 100 0.9950249 1.0049751 1.0149254 
2 200 0.9951691 1.0048309 1.0144928 
3 300 0.9953052 1.0046948 1.0140845 
4 400 0.9954338 1.0045662 1.0136986 

回答

1

您可以在內部矩陣各個列使用轉換:

do.call(data.frame, d) 
## pd.no value.1 value.2 value.3 
## 1 100 0.9950249 1.004975 1.014925 
## 2 200 0.9951691 1.004831 1.014493 
## 3 300 0.9953052 1.004695 1.014085 
## 4 400 0.9954338 1.004566 1.013699 

因此,如果你想melt數據,請嘗試:

library(reshape2) 
melt(do.call(data.frame, d), "pd.no") 
+0

感謝ü。它運作良好。但是,你能告訴我「data.frame(d)」和「do.call(data.frame,d)」之間的區別是什麼,因爲第一個不能工作,但第二個可以? – kanpu

+0

@kanpu,你真正想要做的是'data.frame(d $ value)'。 'do.call(data.frame,d)'方法是對所有值的泛化。如果您彙總了多個列,這可能很有用。 – A5C1D2H2I1M1N2O1R2T1

+0

謝謝。這非常有幫助。 – kanpu

相關問題