2016-02-28 23 views
-2

我是新的R,我猜這應該很容易做到。我有一個很大的數據,每個階段的每個組可能會有兩個或三個變量進行估計。數據是這樣的:如何重塑數據幀的行外並有條件的值

df <- data.frame(
group = c(1, 1, 1, 1, 1), 
period = c(1, 1, 1, 2, 2), 
term  = c("Inv", "Not", "Clue", "Mix", "Clue"), 
estimate = c(-1.2, -.85, -.35, -1, -.6), 
pvalue = c(.001, .01, .00001, .0001, 001) 
) 

    group period term estimate pvalue 
1  1  1 Inv -1.20 1e-03 
2  1  1 Not -0.85 1e-02 
3  1  1 Clue -0.35 1e-05 
4  1  2 Mix -1.00 1e-04 
5  1  2 Clue -0.60 1e+00 

現在我需要summerasie所有信息在一行中的每一輪每一組。它需要以某種方式將行散佈在提及其估計值的列上(如果存在的話),以及如果不存在,則爲NaN。它看起來像這樣:

newdf <- data_frame(
group   = c(1, 1), 
period  = c(1, 2), 
Inv.estimate = c(-1.2, NaN), 
Not.estimate = c(-.85, NaN), 
Clue.estimate = c(-.35, -.6), 
Mix.estimate = c(NaN, -1), 
Inv.pvalue = c(.001, NaN), 
Not.pvalue = c(.01, NaN), 
Clue.pvalue = c(.00001, .001), 
Mix.pvalue = c(NaN, .001) 
) 

    group period Inv.estimate Not.estimate Clue.estimate Mix.estimate Inv.pvalue Not.pvalue Clue.pvalue 
1  1  1   -1.2  -0.85   -0.35   NaN  0.001  0.01  1e-05 
2  1  2   NaN   NaN   -0.60   -1  NaN  NaN  1e-03 
    Mix.pvalue 
1  NaN 
2  0.001 

有沒有簡單的方法來做到這一點?

回答

2

除了dplyr方法,我們還可以使用dcastdata.table可以採取多種value.var列。我們將'data.frame'轉換爲'data.table'(setDT(df)),並使用dcast將'long'轉換爲'wide'格式。

library(data.table) 
dcast(setDT(df), group+period~term, 
     value.var= c("estimate", "pvalue"), sep=".") 
#  group period estimate.Clue estimate.Inv estimate.Mix estimate.Not pvalue.Clue pvalue.Inv pvalue.Mix pvalue.Not 
#1:  1  1   -0.35   -1.2   NA  -0.85  0.00001  0.001   NA  0.01 
#2:  1  2   -0.60   NA   -1   NA  1.00000   NA  0.0001   NA 
+1

很好的瞭解'value.var'功能。很多趕上。 – jazzurro

1

您可以使用dplyr和tidyr包來做到這一點。首先,我用gather()將數據放在一個長格式中。您在一列中具有估計值和pvalue值。您還在一列中有兩個變量名稱,我將其命名爲foo。然後,我使用mutate()來創建列名稱,如您所示。我刪除了術語和foo,因爲它們不再需要。最後,我使用spread()將數據重塑爲寬格式。

library(dplyr) 
library(tidyr) 

gather(df, foo, value, -c(group, period, term)) %>% 
mutate(whatever = paste(term, foo, sep = ".")) %>% 
select(-term, -foo) %>% 
spread(whatever, value) 

    group period Clue.estimate Clue.pvalue Inv.estimate Inv.pvalue Mix.estimate Mix.pvalue Not.estimate 
1  1  1   -0.35  1e-05   -1.2  0.001   NA   NA  -0.85 
2  1  2   -0.60  1e+00   NA   NA   -1  1e-04   NA 
    Not.pvalue 
1  0.01 
2   NA