我尝试使用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
我想要的数据框是,id
,it
和ic
的上半部分对应in=1
和{{1}的下半部分},id
和it
对应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
,in
,id
和it
的最大值以及{{1}的正确分配}}和ic
被忽略了。另外,我错过了一半的数据。任何建议将不胜感激!
in=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