本文翻译自外文博客,原文链接:https:///2013/10/19/reshape/ 一、reshape2 简介
这两个命名十分形象,方便记忆,你可以想象成你在处理金属。当你熔化金属成液体滴下时,金属会被拉长(long-format)。如果你把金属它铸成一个模子,它就会变宽(wide-format)。 二、什么是宽表格和长表格示例数据说明:例子使用内置于R中的空气质量数据集( 每个变量单独成一列的为宽数据,例如: ## ozone wind temp## 1 23.61538 11.622581 65.54839## 2 29.44444 10.266667 79.10000## 3 59.11538 8.941935 83.90323## 4 59.96154 8.793548 83.96774 而长数据中变量的ID没有单独列成一列,而是整合在同一列。 长数据矩阵中一列代表变量类型,另外一列表示对用的变量值。例如: ## variable value## 1 ozone 23.615385## 2 ozone 29.444444## 3 ozone 59.115385## 4 ozone 59.961538## 5 wind 11.622581## 6 wind 10.266667## 7 wind 8.941935## 8 wind 8.793548## 9 temp 65.548387## 10 temp 79.100000## 11 temp 83.903226## 12 temp 83.967742 这并不表示长数据只有两列,比如我们会记录下每个月每天每个空气指标的值,而每个月的天数不一定相等,所以就会出现第三列记录日期。 一般我们实验记录的数据格式(大多习惯用宽表格记录数据)和我们后期用R绘图所用到的数据格式往往不一样,例如 Wide- to long-format data: the melt function例子使用内置于R中的空气质量数据集( names(airquality) <->-> ## ozone solar.r wind temp month day## 1 41 190 7.4 67 5 1## 2 36 118 8.0 72 5 2## 3 12 149 12.6 74 5 3## 4 18 313 11.5 62 5 4## 5 NA NA 14.3 56 5 5## 6 28 NA 14.9 66 5 6 如果我们使用所有默认参数运行 library(reshape2) # 首先加载一下reshape2包aql <- melt(airquality)="" #="" 命名取首字母:[a]ir="" [q]uality="" [l]ong="" formathead(aql)="" #="" 查看数据前6列tail(aql)="" ="" #="">-> 每一步返回的结果: ## No id variables; using all as measure variables## head(aql)## variable value## 1 ozone 41## 2 ozone 36## 3 ozone 12## 4 ozone 18## 5 ozone NA## 6 ozone 28## tail(aql)## variable value## 913 day 25## 914 day 26## 915 day 27## 916 day 28## 917 day 29## 918 day 30 默认情况下 aql <- melt(airquality,="" id.vars="c('month',">-> ## month day variable value## 1 5 1 ozone 41## 2 5 2 ozone 36## 3 5 3 ozone 12## 4 5 4 ozone 18## 5 5 5 ozone NA## 6 5 6 ozone 28 如果我们想控制长数据中的列名怎么办呢? aql <- melt(airquality,="" id.vars="c('month'," 'day'),="" variable.name='climate_variable' ,="" value.name='climate_value'>-> ## month day climate_variable climate_value## 1 5 1 ozone 41## 2 5 2 ozone 36## 3 5 3 ozone 12## 4 5 4 ozone 18## 5 5 5 ozone NA## 6 5 6 ozone 28 Long- to wide-format data: the cast functions首先使用 aql <- melt(airquality,="" id.vars="c('month'," 'day'))aqw="">-><- dcast(aql,="" month="" +="" day="" ~="" variable)head(aqw)head(airquality)="" #="" original="">-> ## month day ozone solar.r wind temp## 1 5 1 41 190 7.4 67## 2 5 2 36 118 8.0 72## 3 5 3 12 149 12.6 74## 4 5 4 18 313 11.5 62## 5 5 5 NA NA 14.3 56## 6 5 6 28 NA 14.9 66## original data## ozone solar.r wind temp month day## 1 41 190 7.4 67 5 1## 2 36 118 8.0 72 5 2## 3 12 149 12.6 74 5 3## 4 18 313 11.5 62 5 4## 5 NA NA 14.3 56 5 5## 6 28 NA 14.9 66 5 6 如果你还不明白上面发生了什么,下面我们使用一张图解来展示:
易错点当每个单元格有多个值时(比如我们想以月而不是天来查看空气指标值,而每个月有多个数据),我们可能会犯一个错。 下面来一个错误示范,这次我们不再将 dcast(aql, month ~ variable) ## month ozone solar.r wind temp## 1 5 31 31 31 31## 2 6 30 30 30 30## 3 7 31 31 31 31## 4 8 31 31 31 31## 5 9 30 30 30 30 当我们在R运行上面的命令时,会返回一条提示信息: ## Aggregation function missing: defaulting to length 查看输出数据时发现,每个单元格填充的数据为每个月的记录天数,并非每个测量指标值。当我们转换数据并且每个单元格有多个值时,还需要使用 下面我们试试以平均值来重新组合数据,并使用参数 dcast(aql, month ~ variable, fun.aggregate = mean, na.rm = TRUE) ## month ozone solar.r wind temp## 1 5 23.61538 181.2963 11.622581 65.54839## 2 6 29.44444 190.1667 10.266667 79.10000## 3 7 59.11538 216.4839 8.941935 83.90323## 4 8 59.96154 171.8571 8.793548 83.96774## 5 9 31.44828 167.4333 10.180000 76.90000 help
注:视频为 高颜值在线绘图在我们的免费高颜值绘图网站也有关于
|
|