我有一个类似于此的数据集(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
关于我如何做到这一点的任何想法?任何帮助表示赞赏。
答案 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 = ".")