缺失数据的R-整形
我有一个类似这样的数据集(df)缺失数据的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
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
。它太优雅了,不能错过。