我希望我不会重新创建方向盘,并且不要认为使用reshape
可以回答以下问题。
我有杂乱的纵向调查数据,我想从宽格式转换为长格式。凌乱我的意思是:
例如:
data <- read.table(header=T, text='
id inlove.1 inlove.2 income.2 income.3 mood.1 mood.3 random
1 TRUE FALSE 87717.76 82281.25 happy happy filler
2 TRUE TRUE 70795.53 54995.19 so-so happy filler
3 FALSE FALSE 48012.77 47650.47 sad so-so filler
')
我无法弄清楚如何使用reshape
重新整形数据,并不断收到错误消息'times' is wrong length
。我假设是因为不是每个场合都记录每个变量。此外,我认为来自melt
的{{1}}和cast
无效,因为它要求所有测量变量属于同一类型。
我提出了以下可能对其他人有帮助的解决方案。它按时间点选择变量,重命名它们,然后使用reshape2
中的rbind.fill
将它们连接在一起。但我想知道我是否遗漏了plyr
的某些内容,或者使用reshape
或其他套餐是否可以更轻松地完成此操作?
tidyr
注意,警告消息表示存在一些丢弃的变量(在本例中为“随机”)。如果所有变量都列为idvar或变量,则不会显示警告。
答案 0 :(得分:1)
如果您将varname.TIME
列填充为NA
所有丢失的时间,则可以reshape
赞成:
uniqnames <- c("inlove","income","mood")
allnames <- make.unique(rep(uniqnames,4))[-(seq_along(uniqnames))]
#[1] "inlove.1" "income.1" "mood.1" "inlove.2" "income.2" "mood.2" ...
data[setdiff(allnames, names(data)[-1])] <- NA
# id inlove.1 inlove.2 income.2 income.3 mood.1 mood.3 random income.1 mood.2 inlove.3
#1 1 TRUE FALSE 87717.76 82281.25 happy happy filler NA NA NA
#2 2 TRUE TRUE 70795.53 54995.19 so-so happy filler NA NA NA
#3 3 FALSE FALSE 48012.77 47650.47 sad so-so filler NA NA NA
reshape(data, idvar="id", direction="long", sep=".", varying=allnames)
# id random time inlove income mood
#1.1 1 filler 1 TRUE NA happy
#2.1 2 filler 1 TRUE NA so-so
#3.1 3 filler 1 FALSE NA sad
#1.2 1 filler 2 FALSE 87717.76 <NA>
#2.2 2 filler 2 TRUE 70795.53 <NA>
#3.2 3 filler 2 FALSE 48012.77 <NA>
#1.3 1 filler 3 NA 82281.25 happy
#2.3 2 filler 3 NA 54995.19 happy
#3.3 3 filler 3 NA 47650.47 so-so