重新整形,缺少数据

时间:2014-08-21 15:53:07

标签: r reshape

我有一个类似于此的数据集(df)。

ID  Variable    Value
A   Height  4
A   Height  4.5
A   Height  5
B   Height  5
B   Height  5.2
B   Height  5.3
C   Height  5.1
C   Height  5.1
C   Height  5.25
A   Weight  110
A   Weight  112
A   Weight  120
B   Weight  111
B   Weight  110
C   Weight  120
C   Weight  114
C   Weight  115

每个变量列出3次,除了"重量"对于B.我需要将其转换为以下形式。

ID  Height1 Height2 Height3 Weight1 Weight2 Weight3
A   4        4.5      5       110   112     120
B   5        5.2    5.3       111   110      .
C   5.1      5.1    5.25      120   114     115

关于我如何做到这一点的任何想法?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

如果高度和重量已经在ID范围内,则以下内容将起作用。我使用dplyr添加一个变量来表示每个ID内的高度和重量序列。

require(dplyr)    
dat = dat %>% group_by(ID, Variable) %>% mutate(seq = 1:n())

require(reshape2)
datwide = dcast(dat, ID ~ Variable + seq, value.var = "Value", fill = ".")
names(datwide) = sub("_", "", names(datwide))

fill参数用于定义要为缺失值放入的内容。我不知道如何从dcast中的名称中删除下划线,但我过去曾使用sub替换它们。

正如@Beasterfield指出的那样,简单地将表示高度和重量序列的数字添加到变量名称会更简洁。因为我使用Variable作为分组变量,所以我无法直接修改它(这可能是用户错误)。相反,我在Variable2中使用了dcast

dat = dat %>% group_by(ID, Variable) %>% mutate(Variable2 = paste0(Variable, 1:n()) )
datwide = dcast(dat, ID ~ Variable2, value.var = "Value", fill = ".")