欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R语言数据整理 之 重塑

程序员文章站 2022-03-11 16:59:12
...

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

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

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

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

相关标签: R