重塑杂乱的纵向调查数据,包含多个不同的变量,从长到长

时间:2016-01-11 03:37:23

标签: r reshape reshape2 tidyr

我希望我不会重新创建方向盘,并且不要认为使用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或变量,则不会显示警告。

1 个答案:

答案 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