R语言数据整理 之 重塑
数据重组对数据分析非常重要。将杂乱的数据整理成整洁当中的学问不得忽视。然而,整洁的标准是什么呢? 可看看这个文章 --> 何为整洁的数据?
可简洁得整理为以下三点:
- 每个变量各占一列;
- 每个观测值各占一行;
- 每个表格或者文件只储存一种观测值的数据。
下面用到mtcars的数据:
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
· reshape2包
用到里面的两个functions,一个melt(),一个dcast():
> library(reshape2)
> melt
function (data, ..., na.rm = FALSE, value.name = "value")
{
UseMethod("melt", data)
}
<environment: namespace:reshape2>
> dcast
function (data, formula, fun.aggregate = NULL, ..., margins = NULL,
subset = NULL, fill = NULL, drop = TRUE, value.var =
guess_value(data))
下面用melt(): id 值有 carname、gear 和 cyl 这些都是 id 类的变量 接下来 它会把剩下的值差不多都糅合在一起 因此就得到了一个非常瘦小的数据框 在 variable 这一列中 你会看到 mpg 和 hp 基本上这样重组过后的数据框都是瘦而长的 这里每个 mpg 的值对应一行 每个 hp 的值也对应一行
> carMelt<-melt(mtcars,id=c("carname","gear","cyl"),measure.vars = c("mpg","hp"))
> head(carMelt)
carname gear cyl variable value
1 Mazda RX4 4 6 mpg 21.0
2 Mazda RX4 Wag 4 6 mpg 21.0
3 Datsun 710 4 4 mpg 22.8
4 Hornet 4 Drive 3 6 mpg 21.4
5 Hornet Sportabout 3 8 mpg 18.7
6 Valiant 3 6 mpg 18.1
> tail(carMelt)
carname gear cyl variable value
59 Porsche 914-2 5 4 hp 91
60 Lotus Europa 5 4 hp 113
61 Ford Pantera L 5 8 hp 264
62 Ferrari Dino 5 6 hp 175
63 Maserati Bora 5 8 hp 335
64 Volvo 142E 4 4 hp 109
后面进行改写,用dcast(): 这个函数就是对数据集做了一个汇总,你会发现这个数据集比原先的小很多,默认情况下 它是通过链接来完成的,下面还传递其它函数mean 来做出, 与此前一样 如果我们让它以这个方式改写数据, 它会将 cyl 的值放在不同行 variable 放在不同列 ,然后让它取平均值 :
> cylData<-dcast(carMelt,cyl ~ variable,mean)
> cylData
cyl mpg hp
1 4 26.66364 82.63636
2 6 19.74286 122.28571
3 8 15.10000 209.21429
类似的还有tapply(x,y,fun),或者 split-apply-combine (分割-应用-结合)
ddply
function (.data, .variables, .fun = NULL, ..., .progress = "none",
.inform = FALSE, .drop = TRUE, .parallel = FALSE, .paropts = NULL)
{
if (empty(.data))
return(.data)
.variables <- as.quoted(.variables)
pieces <- splitter_d(.data, .variables, drop = .drop)
ldply(.data = pieces, .fun = .fun, ..., .progress = .progress,
.inform = .inform, .parallel = .parallel, .paropts = .paropts)
}
<environment: namespace:plyr>