R语言数据整理 之 重塑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kidpea_lau/article/details/82789839

数据重组对数据分析非常重要。将杂乱的数据整理成整洁当中的学问不得忽视。然而,整洁的标准是什么呢? 可看看这个文章 --> 何为整洁的数据?

可简洁得整理为以下三点:

  • 每个变量各占一列;
  • 每个观测值各占一行;
  • 每个表格或者文件只储存一种观测值的数据。

下面用到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>

猜你喜欢

转载自blog.csdn.net/kidpea_lau/article/details/82789839