缺失数据的R-整形

缺失数据的R-整形,r,reshape,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 Weig

我有一个类似这样的数据集(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
除了B的“重量”外,每个变量都列出了3次。我需要将其转换为以下形式

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

有什么办法可以做到吗?感谢您的帮助

如果高度和重量已经在
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所指出的,简单地将表示高度和权重序列的数字添加到变量名中会更简洁。因为我使用了
变量
作为分组变量,所以无法直接修改它(这可能是用户错误)。相反,我制作了
Variable2
用于
dcast

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

到目前为止,您尝试了什么?@Floo0尝试了一个简单的强制转换(df,id~变量),但这并不能解决问题。考虑过标记1、2、3,每次为每个ID重复一个变量,但问题是有些变量只列出两次。我的数据集很长,无法手动操作。在转换到列
Height1
Height2
等后,您如何知道对应的高度和重量?根据其显示顺序进行了调整。如果它是列表中第一个出现的高度,那将是高度1,第二个将是高度2…因此,如果列名必须与问题中的格式完全相同,则可以通过
mutate(Variable=paste0(Variable,1:n())直接修改
变量
@Beasterfields建议很好,它允许您使用
spread()
(来自tidyr)像
dat%%>%groupby(ID)%%>%mutate(Variable=paste(Variable,1:n(),sep=“.”)%%>%spread(Variable,Value)
good thinking@Beasterfield。这总比编辑后面的名字好。我肯定要深入研究
tidyr
。它太优雅了,不能错过。