2016-02-28 67 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