zoukankan      html  css  js  c++  java
  • 在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法

    原网址 http://blog.sina.com.cn/s/blog_6bb07f83010152z0.html

    在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法。
    1.查看数据

    head(dataframe) # 查看数据前10行
    tail(dataframe) # 查看数据后10行



    2.合并数据
    (1)data.frame(x,y)
    x,y是dataframe或者一列数据,x和y的行数一样,该操作得到一个新的dataframe,
    该dataframe是x和y拼合而成,行数与x/y的行数相同,列数为x和y的列数和。
    例:

     
     > x<-c(1:10) > y<-x^2 > newdata<-data.frame(x,y) > head(newdata) x y 1 1 1 2 2 4 3 3 9 4 4 16 5 5 25 6 6 36 > z<-c(2:11) > newdata<-data.frame(newdata, z) > head(newdata) x y z 1 1 1 2 2 2 4 3 3 3 9 4 4 4 16 5 5 5 25 6 6 6 36 7 


    (2)cbind(x,y)
    等同于data.frame(x,y)

    (3)rbind(x,y)
    x,y均为data.frame,要求x和y的列向量个数一致,该操作得到一个新的dataframe,
    该dataframe是x和y的数据拼接起来,行数等于x和y的行数之和,列数等于x/y的列数
    例:

     
     > t<-c(0,0,0) > newdata<-rbind(newdata, t) > newdata x y z 1 1 1 2 2 2 4 3 3 3 9 4 4 4 16 5 5 5 25 6 6 6 36 7 7 7 49 8 8 8 64 9 9 9 81 10 10 10 100 11 11 0 0 0 
     

    3.筛选数据
    (1)subset:从一个dataframe中筛选出符合条件的数据

     
     > newdata x y z 1 1 1 2 2 2 4 3 3 3 9 4 4 4 16 5 5 5 25 6 6 6 36 7 7 7 49 8 8 8 64 9 9 9 81 10 10 10 100 11 11 0 0 0
     
     
     > newdata.subset<-subset(newdata, z>5) > newdata.subset x y z 5 5 25 6 6 6 36 7 7 7 49 8 8 8 64 9 9 9 81 10 10 10 100 1
     
     
     > subset(newdata, z>6&x>8) x y z 9 9 81 10 10 10 100 11
     
     
     > subset(newdata, z>6|x!=0) x y z 1 1 1 2 2 2 4 3 3 3 9 4 4 4 16 5 5 5 25 6 6 6 36 7 7 7 49 8 8 8 64 9 9 9 81 10 10 10 100 11 
     
     

    (2)transform:对一个dataframe做一些变换

     
     > newdata.tran x y z newx 1 1 1 2 -1 2 2 4 3 -2 3 3 9 4 -3 4 4 16 5 -4 5 5 25 6 -5 6 6 36 7 -6 7 7 49 8 -7 8 8 64 9 -8 9 9 81 10 -9 10 10 100 11 -10 11 0 0 0 0 > newdata.tran<-transform(newdata, newx=-x, newy=log(y)) > newdata.tran x y z newx newy 1 1 1 2 -1 0.000000 2 2 4 3 -2 1.386294 3 3 9 4 -3 2.197225 4 4 16 5 -4 2.772589 5 5 25 6 -5 3.218876 6 6 36 7 -6 3.583519 7 7 49 8 -7 3.891820 8 8 64 9 -8 4.158883 9 9 81 10 -9 4.394449 10 10 100 11 -10 4.605170 11 0 0 0 0 -Inf
     
     
      
     4.去除重复数据
     
     
     > x<-c(1,0,1,0); > y<-c(0,0,1,0) > test<-data.frame(x,y) > test x y 1 1 0 2 0 0 3 1 1 4 0 0 > duplicated(test) [1] FALSE FALSE FALSE TRUE
     
     > test1<-test[which(!duplicated(test)),] > test1 x y 1 1 0 2 0 0 3 1 1 
     
     
     
     
    5.两种数据按照指定key聚合
    (1)merge > z # z是一个dataframe
     

    x y
    1 1 5
    2 2 9
    3 3 4

    > w # w是一个dataframe
    w1 w2
    1 5 2.5
    2 4 2.0
    3 9 3.0

    现在想将w的第二列按照z的第二列和w的第一列的对应关系合并到z里面
    即变成:
    x y w2
    1 1 5 2.5
    2 2 9 3.0
    3 3 4 2.0

    merge(z, w, by.x='y', by.y='w1', sort=F)
      y x  w2
    1 5 1 2.5
    2 9 2 3.0
    3 4 3 2.0


     

      6.数据聚合,融合(需要载入reshape包) 
      (1)melt(data, id.vars, measure.vars)
    data以id.vars指定的列为key,将measure.vars指定的列做拆分,以前的key->a1,a2,...aN 拆成 key->a1, key->a2, ..., key->aN。在拆分 的时候增加一个label,表明a1,a2,...,aN来源于以前的data中的哪一列。
    例:df是一个dataframe,包含x,y坐标,对应的label,以及用logit和svm预测的结果,我们希望按照x,y把一行数据按照label,logit,svm拆成三行数据,分别用不同的标号代表来源于label、logit还是svm,然后用另外一个标号表示原来label,logit,svm的取值,因此原来2500行的数据会被拆分成7500个(2500*3),同时原来5列变量变成4列变量(x,y,值来源于哪一列,该列的取值)
     > head(df) X Y Label Logit SVM 1 0.2655087 0.52601906 1 0 1 2 0.3721239 0.07333542 1 0 1 3 0.5728534 0.84974175 1 0 1 4 0.9082078 0.42305801 0 0 0 5 0.2016819 0.98809607 0 0 1 6 0.8983897 0.47887413 0 0 0 > dim(df) [1] 2500 5 > predictions <- melt(df, id.vars = c('X', 'Y')) > head(predictions) X Y variable value 1 0.2655087 0.52601906 Label 1 2 0.3721239 0.07333542 Label 1 3 0.5728534 0.84974175 Label 1 4 0.9082078 0.42305801 Label 0 5 0.2016819 0.98809607 Label 0 6 0.8983897 0.47887413 Label 0 > dim(predictions) [1] 7500 4 > table(predictions$variable) Label Logit SVM 2500 2500 250 
     
    (2)cast
     
     
    head(installations)
    # Package User Installed
    #1 abind 1 1
    #2 AcceptanceSampling 1 0
    #3 ACCLMA 1 0
    #4 accuracy 1 1
    #5 acepack 1 0
    #6 aCGH.Spline 1 0
     
    # Ninth code snippet
    library('reshape')
     
    # user和Package构成一个矩阵,矩阵的数值用installed列对应的数填充,即matrix(i,j)表示用户i是否有安装packagej
    user.package.matrix <- cast(installations, User ~ Package, value = 'Installed') 
     
    user.package.matrix[, 1] # 第一列表示user的编号
    # [1] 1 3 4 5 6 7 8 9 11 13 14 15 16 19 21 23 25 26 27 28 29 30 31 33 34
    #[26] 35 36 37 40 41 42 43 44 45 46 47 48 49 50 51 54 55 56 57 58 59 60 61 62 63
    #[51] 64 65
     
    user.package.matrix[, 2] # 后面n列表示每个user是否有按照某个Package包
    # [1] 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1
    #[39] 1 1 1 1 1 1 1 1 0 1 1 1 1 1
  • 相关阅读:
    静态链表与动态链表(C语言实现)
    Java处理java.util.ConcurrentModificationException异常
    java读取文件
    java如何引入接口中定义的常量
    java反编译命令javap
    【算法】如何将一个文件分割成多份(C,Java语言实现)
    【算法】计算一篇文章的单词数(C、Java语言实现)
    如何将mongodb bson文件转成json文件
    Gunicorn快速入门
    nginx+uwsgi+django
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6505263.html
Copyright © 2011-2022 走看看