我希望将无序长数据转换为宽数据。
mydata <- data.frame(cat = c('a','a','a','b','c','c','c','c'),
color = c( 1, 1, 1, 2, 1, 1, 1, 1),
hat = c( 1, 1, 2, 2, 1, 2, 1, 2),
shoe = c( 0, 1, 1, 2, 1, 1, 1, 3))
cat
是ID变量,而color是描述性统计信息,在cat
内不会更改。
mydata
cat color hat shoe
1 a 1 1 0
2 a 1 1 1
3 a 1 2 1
4 b 2 2 2
5 c 1 1 1
6 c 1 2 1
7 c 1 1 1
8 c 1 2 3
最终输出
cat color hat1 shoe1 hat2 shoe2 hat3 shoe3 hat4 shoe4
1 a 1 1 0 1 1 2 1 NA NA
2 b 2 2 2 NA NA NA NA NA NA
3 c 1 1 1 2 1 1 1 2 3
我似乎面临的挑战是没有“时间变量”。
答案 0 :(得分:5)
通过cat添加计数器,然后您可以将其用作时间变量:
library(data.table)
mydata <- data.table(cat = c('a','a','a','b','c','c','c','c'),
color = c( 1, 1, 1, 2, 1, 1, 1, 1),
hat = c( 1, 1, 2, 2, 1, 2, 1, 2),
shoe = c( 0, 1, 1, 2, 1, 1, 1, 3))
mydata[, "dummy.id" := seq(.N), by=cat]
widedata <- reshape(mydata, idvar='cat', timevar='dummy.id', direction='wide')
答案 1 :(得分:2)
我们可以使用dcast
版本的data.table中的devel
,即v1.9.5 +。我们创建了一个序列变量(&#39; indx&#39;),按照&#39; cat&#39;和&#39; color&#39;柱。然后dcast
来自&#39; long&#39;广泛的&#39;并指定value.var
列。
library(data.table)#v1.9.5+
mydata[, indx:=1:.N, by = .(cat, color)]
dcast(mydata, cat+color~indx, value.var=c('hat', 'shoe'))
# cat color hat_1 hat_2 hat_3 hat_4 shoe_1 shoe_2 shoe_3 shoe_4
#1: a 1 1 1 2 NA 0 1 1 NA
#2: b 2 2 NA NA NA 2 NA NA NA
#3: c 1 1 2 1 2 1 1 1 3
注意:安装devel版本的说明是here
通过与getanID
splitstackshape
(以创建序列变量),可以使其变得紧凑
library(splitstackshape)
dcast(getanID(mydata, c('cat', 'color')),
cat+color~.id, value.var=c('hat', 'shoe'), sep='')
# cat color hat1 hat2 hat3 hat4 shoe1 shoe2 shoe3 shoe4
#1: a 1 1 1 2 NA 0 1 1 NA
#2: b 2 2 NA NA NA 2 NA NA NA
#3: c 1 1 2 1 2 1 1 1 3