write down,forget
  • adidaseqt
  • eqtturbored
  • eqtsupport9317
  • eqtsupport
  • 9317adidas
  • adidaseqtboost9317
  • eqtsupport93
  • 9317eqt
  • eqt support 9317 adv
  • support 9317 adv
  • eqtadv
  • eqt9317
  • eqtadv9317
  • support93
  • originalseqt
  • adidas eqt
  • eqt support 9317
  • eqt support
  • eqt adv
  • eqt 9317
  • R矩阵及数据框操作

    <Category: R> 查看评论

    R数据框操作,添加一列,并实现分组统计

    rbind,基于行,cbind,基于列
    矩阵合并(矩阵只能存数字,如果列为非数字,会自动处理)

    > <-rbind(1:7,1:7)
    > matrix
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    [1,]    1    2    3    4    5    6    7
    [2,]    1    2    3    4    5    6    7

    > matrix<-cbind(1:7,1:7)
    > matrix
    [,1] [,2]
    [1,]    1    1
    [2,]    2    2
    [3,]    3    3
    [4,]    4    4
    [5,]    5    5
    [6,]    6    6
    [7,]    7    7

    #字母自动变成数列
    > rbind(c(“a”,”b”,”c”),1:3
    + )
    [,1] [,2] [,3]
    [1,] “a”  “b”  “c”
    [2,] “1”  “2”  “3”

     

    现有如下数据框,需要加一列,并通过时间分组进行统计
    > data
    obj time
    1   a    1
    2   b    5
    3   c   10
    4   d   50
    5   e  100
    6   f  150
    7   g  200

    > cbind(data$time,1:7)
    [,1] [,2]
    [1,]    1    1
    [2,]    5    2
    [3,]   10    3
    [4,]   50    4
    [5,]  100    5
    [6,]  150    6
    [7,]  200    7

    > df<-data.frame(cbind(data$time,1:7))
    > df
    X1 X2
    1   1  1
    2   5  2
    3  10  3
    4  50  4
    5 100  5
    6 150  6
    7 200  7

    ok,下面就是最见证奇迹的时刻了
    > df[which(X1<10),][“X2″]=”<10”
    > df
    X1  X2
    1   1 <10
    2   5 <10
    3  10   3
    4  50   4
    5 100   5
    6 150   1
    7 200   1

    搞到不用which的新写法
    > df[ df$X1>1 & df$X1<30 , “X2″]=”1~30”
    >
    > df
    X1   X2
    1   1  <10
    2   5 1~30
    3  10 1~30
    4  50    4
    5 100    5
    6 150    6
    7 200    7
    df[which(X1<10),][“X2″]=”<10”
    df[ df$X1>=10 & df$X1<30 , “X2″]=”10~30”
    df[ df$X1>=30 & df$X1<50 , “X2″]=”30~50”
    df[ df$X1>=50 & df$X1<70 , “X2″]=”50~70”
    df[ df$X1>=70 & df$X1<90 , “X2″]=”70~90”
    df[ df$X1>=90 & df$X1<100 , “X2″]=”90~100”
    df[ df$X1>=100 & df$X1<150 , “X2″]=”100~150”
    df[ df$X1>=150 & df$X1<200 , “X2″]=”150~200”
    df[ df$X1>=200, “X2″]=”>200″

    最后结果:

    > df
    X1      X2
    1   1     <10
    2   5     <10
    3  10   10~30
    4  50   50~70
    5 100 100~150
    6 150 150~200
    7 200    >200

    太累了,有么有高级点的办法啊?

    后面找到了cut方法,使用方法如下:
    break指定区间范围,cut结果输出原始数据所在的区间范围

    > x
    [1]  1  2  3  4  5  6  7  8  9 10
    > f <- cut(x, breaks=c(0, 100, 200))
    > f
    [1] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100] (0,100]
    Levels: (0,100] (100,200]

    还自定义label
    > f <- cut(x=df$X1, breaks=c(0, 10, 30,50,70,90),labels=c(“0~10″,”10~30″,”30~50″,”50~70″,”70~90”))
    > f
    [1] 0~10  0~10  0~10  30~50 <NA>  <NA>  <NA>
    Levels: 0~10 10~30 30~50 50~70 70~90
    tapply分组统计

    > df
    X1      X2
    1   1     <10
    2   5     <10
    3  10   10~30
    4  50   50~70
    5 100 100~150
    6 150 150~200
    7 200    >200
    > f <- cut(x=df$X1, breaks=c(0, 10, 30,50,70,90,200),labels=c

    (“0~10″,”10~30″,”30~50″,”50~70″,”70~90″,”90~200″))
    > f
    [1] 0~10   0~10   0~10   30~50  90~200 90~200 90~200
    Levels: 0~10 10~30 30~50 50~70 70~90 90~200
    > tapply(!is.na(df$X1), df, sum)
    X2
    X1    <10 >200 10~30 100~150 150~200 50~70
    1     1   NA    NA      NA      NA    NA
    5     1   NA    NA      NA      NA    NA
    10   NA   NA     1      NA      NA    NA
    50   NA   NA    NA      NA      NA     1
    100  NA   NA    NA       1      NA    NA
    150  NA   NA    NA      NA       1    NA
    200  NA    1    NA      NA      NA    NA
    > f
    [1] 0~10   0~10   0~10   30~50  90~200 90~200 90~200
    Levels: 0~10 10~30 30~50 50~70 70~90 90~200
    > tapply(!is.na(df$X1), f, sum)
    0~10  10~30  30~50  50~70  70~90 90~200
    3     NA      1     NA     NA      3

    总结,cut返回factor变量因子,可以用来作为分组的依据,然后通过taaply,对原始的数据框进行分组统计
    有了这些分组数据之后,就可以很方便用ggplot来出图了

    x<-tapply(!is.na(time), f, sum)

    #转换成数据框
    df <- data.frame(range=rownames(x),count=x)

    #画饼图
    pie(x, labels = rownames(x), main=”Query Time”)

    报了个错误:
    #错误于pie(x, labels = rownames(x), main = “Pie Chart of Countries”) :
    #’x’必需是正数.

    需要处理缺失数据NA,如下即可:

    #获取缺失数据
    missing <- is.na(x)
    #缺失数据赋值,默认值,如0
    x[missing]=0

    #简单用法
    pie(x, labels = rownames(x), main=”Query Time”)

    #标签带上百分比
    slices<-x
    lbls<-rownames(x)
    pct <- round(slices/sum(slices)*100)
    lbls <- paste(lbls, pct) # add percents to labels
    lbls <- paste(lbls,”%”,sep=””) # ad % to labels
    pie(slices,labels = lbls, col=rainbow(length(lbls)),
    main=”Query Time”)

     
    参考:
    http://www.diandian.com/tag/r%E8%AF%AD%E8%A8%80
    http://addictedtor.free.fr/graphiques/
    http://xccds1977.blogspot.com/2012/03/reshape.html
    http://www.oschina.net/code/snippet_222150_8512
    http://addictedtor.free.fr/graphiques/thumbs.php

    本文来自: R矩阵及数据框操作

    
    eqt support adidas eqt support 93 primeknit og colorway ba7506 adidas eqt running 93 updated with primeknit construction adidas eqt boost 93 17 white turbo red adidas eqt support 9317 white turbo red adidas eqt support 93 17 adidas eqt support 9317 adidas eqt support 9317 turbo red releases tomorrow adidas originals adidas eqt tactile green pack adidas eqt tactile green pack adidas eqt light green pack womens adidas eqt light green pack coming soon adidas eqt milled leather pack release date adidas originals eqt milled leather pack adidas eqt support ultra boost turbo red white adidas adv support burnt orange grey where to buy the adidas eqt support 9317 turbo red adidas eqt boost 91 16 turbo red adidas eqt support 93 turbo red adidas eqt support 9317 white turbo red available now