reshape2包

1.长/宽数据

R语言中,90%的情况下都是使用长型数据,比如构建回归模型,或者利用ggplot2构图,因此当遇到宽型数据时,第一时间就是要把它们转变成长型数据。
①宽型数据
每一列为一个变量,每一行为变量所对应的值

> library(openxlsx)
> data = read.xlsx("/Users/afei/Desktop/test.xlsx")
> head(data)
  组别 1月份 2月份 3月份 4月份 5月份 6月份
1 一组 40589 46475 54354 46497 40231 45402
2 二组 49351 54296 42200 47931 39243 41578
3 三组 41983 53099 39552 48860 53591 41799
4 四组 53883 52806 46719 38767 47856 42595
5 五组 41859 46403 45893 43950 51762 50848
6 六组 40231 48046 44355 49756 44490 50003

②长型数据
一列包含了所有的变量,而另一列则是与之相关的值,长数据不一定只有两列

  组别  月份 value
1 一组 1月份 40589
2 二组 1月份 49351
3 三组 1月份 41983
4 四组 1月份 53883
5 五组 1月份 41859
6 六组 1月份 40231

2.melt

通常,我们会拿到一个数据表,将其转换为一系列事项,然后将其修整为所需的格式。将数据表转换成事项列表的过程称为熔解(melt),将事项列表转换成数据表的过程称为铸造(cast)。
melt函数:将宽数据转换成长数据(逆透视)
cast函数:将长数据转换成宽数据(透视)
melt是一个泛型函数,在reshape2包中有分别用于数据框、数组和列表的melt方法。

melt(data,id.vars,measure.vars,variable.name='variable',...,na.rm=FALSE,value.name='value',factorAsStrings=TRUE)

下面简单介绍各个参数:

#要溶解的数据框:data
#ID变量(用于标识观察的变量):id.vars
#测量变量(用于描述所测量的事物的变量):measure.vars
#用于保存原始变量名的变量的名称:variable.name
#用于保存原始值的名称:value.name
#告诉melt如何处理NA值:na.rm,na.rm = TRUE删除NA值
#告诉melt是否要将字符变量转化成因子:factorAsStrings

举例(此处用R内置的airquality数据集):

#首先将列名改成小写
names(airquality) <- tolower(names(airquality))
#查看相应的数据
head(airquality)

默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。如果id.vars和measure.vars都没有设置,默认会使用所有的因子变量和字符变量作为ID变量,使用所有的非因子和非字符变量作为测量变量

#直接用metl函数处理上述的数据
aql <- melt(airquality)
head(aql)
#再看末尾的几个数据
tail(aql)

数据集的熔解是将它重构为这样一种格式:每个观测变量独占一行,行中要带有唯一确定这个测量所需的标识变量。

使用id.vars参数的情况:此时想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉melt,month和day是"ID variables"

aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)

使用variable.name和value.name的情况:此时想修改长数据中的列名

md <- melt(airquality, id.vars = c("month", "day"), value.name = "New_Value", variable.name = "Class")
head(md)

使用measure.vars的情况

ml <- melt(airquality,id.vars = c("month","day"),measure.vars = "ozone")
head(ml)
#再看末尾的几个数据
tail(ml)

3.cast

①dcast:针对数据框
dcast借助于公式来描述数据的形状,左边参数表示"ID variables",而右边的参数表示measured variables。可能需要几次尝试,才能找到合适的公式。

dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL, fill = NULL, drop = TRUE,value.var = guess_value(data))

下面简单介绍各个参数:

#已溶解的数据框(通常是melt函数创建的):data
#描述输出结果的公式,比如x~y,则x表示数据透视表的行,y代表数据透视表的列:formula
#聚合函数。如果要聚合输出结果中一溶解的数据,用这个参数可以设置聚合函数。可以使用自定义函数:fun.aggregate
#相当于透视表中的行总计和列总计:margins
#选取满足一些特定值的数据,相当于Excel透视表的筛选:subset。例如, subset =.(variable ==“length”)

举例(此处仍使用R内置的airquality数据集):

#去除缺失值
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
head(aqm)
#计算按月份分组的每个变量的均值以及行列合计
dcast(aqm, month ~ variable, mean, margins = c("month", "variable"),na.rm=TRUE)
#和上面的例子一样,对调了一下行和列
dcast(aqm, variable ~ month, mean, margins = c("month", "variable"))

②acast:针对向量、矩阵、数组
函数表达式同dcast,只是输出结果不同
acast输出结果省略了id这个列,而dcast则输出id列

举例(此处仍使用R内置的airquality数据集):

dcast(aqm,month~variable,mean)
acast(aqm,month~variable,mean)
#加margins参数后,仍为以上区别
dcast(aqm, month ~ variable, mean, margins = TRUE)
acast(aqm, month ~ variable, mean, margins = TRUE)
#只对列求平均值
dcast(aqm, month ~ variable,mean,margins=c("month"))
acast(aqm, month ~ variable,mean,margins=c("month"))
#只对行求平均值
dcast(aqm, month ~ variable,mean,margins=c("variable"))
acast(aqm, month ~ variable,mean,margins=c("variable"))
#三维的情况下acast输出的是一个数组,而dcast则报错,因为dcast输出结果为数据框。
dcast(aqm,month ~ day ~ variable)
acast(aqm,month ~ day ~ variable)
#使用subset参数的情况
library(plyr) #为了使用subset函数
dcast(aqm,variable~month,mean,subset=.(variable=="ozone"))
acast(aqm,variable~month,mean,subset=.(variable=="ozone"))
dcast(aqm,variable~month,mean,subset=.(month==5))
acast(aqm,variable~month,mean,subset=.(month==5))
dcast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))
acast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容