数据长宽格式的转换时,通常需要用到reshape2包中的函数,何为数据的长宽格式?以下为示例。
宽格式的数据每个变量都有单独的一列,例如
## 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
以下为长格式
## No id variables; using all as measure variables
## 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
长格式数据的一列用于表示可能的变量类型,一列用于表示这些变量的值。 长格式数据不一定只有两列。 例如,我们可能会有一年中每一天的臭氧测量值。 在这种情况下,我们可以在一天中增加另一列。 换句话说,“长度”有不同的级别。 您想要获取数据的最终形状将取决于您在处理数据。
事实证明,某些类型的数据分析需要宽格式数据,而其他类型则需要长格式数据。例如,ggplot2需要长格式数据(技术上是整洁的数据),plyr需要长格式数据,并且大多数建模函数(例如lm(),glm()和gam())都需要长格式数据。 但是人们经常发现更容易以宽格式记录数据。
melt 函数:宽格式-长格式
names(airquality) <- tolower(names(airquality))
head(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
使用melt函数时
aql <- melt(airquality) # [a]ir [q]uality [l]ong format
## 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
默认情况下,melt假定所有具有数字值的列都是具有值的变量。 想知道每个月和一天的臭氧,solar.r,风和温度的值时候,可以通过设置id.vars来指定变量。
aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)
## 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")
head(aql)
## 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
cast functions:长格式-宽格式
aql <- melt(airquality, id.vars = c("month", "day"))
aqw <- dcast(aql, month + day ~ variable)
head(aqw)
## 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
head(airquality) # 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
您可能会犯的一个令人困惑的“错误”是投射一个数据集,其中每个数据单元都有多个值。 例如,这一次我们将不包括day作为ID变量:
dcast(aql, month ~ variable)
## Aggregation function missing: defaulting to length
## 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
When you run this in R
, you’ll notice the warning message:
# Aggregation function missing: defaulting to length
每个月气候组合的单元格将填充数据行数。 我们看到的数字是每个月记录的天数。 dcast时,每个单元格有多个值时,还需要告诉dcast如何汇总数据,如采用均值,中位数或总和。 我们还将通过...参数传递选项na.rm = TRUE以删除NA值。 (...让您将其他参数传递给funn.aggregate函数,此处表示平均值。)
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
reference: