在R中使用dcast将数据帧从长格式转换为宽格式不起作用

时间:2014-05-11 19:00:16

标签: r reshape2

我尝试使用dcast功能将数据帧从长格式转换为宽格式。

以下是起始数据框:

convID     var      value
aa         in       1
ab         in       1
aa         id       4/29/2014
ab         id       4/20/2014
aa         it       Impr
ab         it       Impr
aa         ic       Display
ab         ic       Display
ab         in       2
ab         in       2
aa         id       4/25/2014
ab         id       4/24/2014
aa         it       Impr
ab         it       Click
aa         ic       Display
ab         ic       SEM

我想要的数据框是,iditic的上半部分对应in=1和{{1}的下半部分},idit对应ic

in=2

但是我无法使用dcast功能获得所需的数据帧。我尝试了很多次,最接近的是以下内容:

convID     in     id           it       ic
aa         1      4/29/204     Impr     Display
ab         1      4/20/204     Impr     Display
aa         2      4/25/204     Impr     Display
aa         2      4/24/204     Click    SEM 

这显然不正确,因为它返回dcast(df,convID~var, value.var="value", fun.aggregate=max) convID in id it ic aa 2 4/29/204 Impr Display aa 2 4/24/204 Impr SEM inidit的最大值以及{{1}的正确分配}}和ic被忽略了。另外,我错过了一半的数据。任何建议将不胜感激!

in=1

1 个答案:

答案 0 :(得分:3)

您的问题是in不是数据框中的变量(我将名称更改为inval,因为尝试使用名为{{1}的变量时会出现一些奇怪的现象} in}。

我使用within生成inval,将每行的值设置为上一个指定的值:

zoo::na.locf

这导致:

library(zoo)
df <- within(df,{
    inval <- ifelse(var=="in",value,NA)
    inval <- na.locf(inval)
})

然后很容易str(df) ## 'data.frame': 16 obs. of 4 variables: ## $ convID: Factor w/ 2 levels "aa","ab": 1 2 1 2 1 2 1 2 1 2 ... ## $ var : Factor w/ 4 levels "ic","id","in",..: 3 3 2 2 4 4 1 1 3 3 ... ## $ value : chr "1" "1" "4/29/14" "4/20/14" ... ## $ inval : chr "1" "1" "1" "1" ...

dcast