tidyverse系列包中的函数操作都是针对简洁数据框进行的,对于不是简洁的数据,实现需要进行数据重塑。数据重塑主要包括长宽表的转换、拆分/合并列、方形化。长宽表转化最初使用的是reshape2包的melt()和cast()函数,后来又发展到早起tidyr包的gather()和spread()函数,现在tidyr 1.0之后又提供了更加易用的pivot_longer()和pivot_wider()函数。
melt()实现了将宽表转化为长表的功能。
melt(data,id.vars=c(" "),measure.vars=c(" "),variable.name="variable",value.name="value")
其中:
> Df
# key a b c
# 1 A NA NA 1
# 2 B NA 2 NA
# 3 C 3 NA NA
# 4 D NA 4 NA
# 5 E NA NA 5
melt(Df,id.vars = 'key',measure.vars = c('a','b','c'),variable.name = 'vars',value.name = 'value' )
# key vars value
# 1 A a NA
# 2 B a NA
# 3 C a 3
# 4 D a NA
# 5 E a NA
# 6 A b NA
# 7 B b 2
# 8 C b NA
# 9 D b 4
# 10 E b NA
# 11 A c 1
# 12 B c NA
# 13 C c NA
# 14 D c NA
# 15 E c 5
dcast()实现了将长表转化为宽表的功能。
dcast( data, formula, value.var...)
其中,formula的形式为var1+var2~variable, var1和var2表示码是变化中不变的列,variable表示变量名列的列名;
value.var表示数据列的列名。
DF=data.frame(v=1:5,key=LETTERS[1:5],vars=sample(letters[1:3],5,replace = T))
# v key vars
# 1 1 A c
# 2 2 B b
# 3 3 C a
# 4 4 D b
# 5 5 E c
dcast(DF,formula = key~vars,value.var = 'v')
# key a b c
# 1 A NA NA 1
# 2 B NA 2 NA
# 3 C 3 NA NA
# 4 D NA 4 NA
# 5 E NA NA 5