R语言初学者——数据转换(三)

在Excel中,我们可以轻松地实现数据的转置,在R语言中,同样可以做到

> car<-read.table('mtcars.csv',header = T,nrows = 5,sep=',')
> car
                  X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2     Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3        Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4    Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
> t(car)
     [,1]        [,2]            [,3]         [,4]            
X    "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive"
mpg  "21.0"      "21.0"          "22.8"       "21.4"          
cyl  "6"         "6"             "4"          "6"             
disp "160"       "160"           "108"        "258"           
hp   "110"       "110"           " 93"        "110"           
drat "3.90"      "3.90"          "3.85"       "3.08"          
wt   "2.620"     "2.875"         "2.320"      "3.215"         
qsec "16.46"     "17.02"         "18.61"      "19.44"         
vs   "0"         "0"             "1"          "1"             
am   "1"         "1"             "1"          "0"             
gear "4"         "4"             "4"          "3"             
carb "4"         "4"             "1"          "1"             
     [,5]               
X    "Hornet Sportabout"
mpg  "18.7"             
cyl  "8"                
disp "360"              
hp   "175"              
drat "3.15"             
wt   "3.440"            
qsec "17.02"            
vs   "0"                
am   "0"                
gear "3"                
carb "2"                

若想对单独一列进行转置就要用到rev(),它是reverse的意思

> women
   height weight
1      58    115
2      59    117
3      60    120
4      61    123
5      62    126
6      63    129
7      64    132
8      65    135
9      66    139
10     67    142
11     68    146
12     69    150
13     70    154
14     71    159
15     72    164
> rev(rownames(women))#先将列名翻转
 [1] "15" "14" "13" "12" "11" "10" "9"  "8"  "7"  "6"  "5"  "4"  "3"  "2"  "1" 

> women[rev(rownames(women)),]#在利用反转后的列名进行访问
   height weight
15     72    164
14     71    159
13     70    154
12     69    150
11     68    146
10     67    142
9      66    139
8      65    135
7      64    132
6      63    129
5      62    126
4      61    123
3      60    120
2      59    117
1      58    115

若我们想改变数据某一列的值呢?

可以这样

> head(women)
  height weight
1     58    115
2     59    117
3     60    120
4     61    123
5     62    126
6     63    129
> women1<-head(women)
[1] 58 59 60 61 62 63
> data.frame(women1$height*2.54,women1$weight)
  women1.height...2.54 women1.weight
1               147.32           115
2               149.86           117
3               152.40           120
4               154.94           123
5               157.48           126
6               160.02           129
> data.frame(height=women1$height*2.54,weight=women1$weight)
  height weight
1 147.32    115
2 149.86    117
3 152.40    120
4 154.94    123
5 157.48    126
6 160.02    129

当然,在R语言中,transform()函数可以直接实现这一点

> women2<-transform(women1,height=women1$height*2.54)
> women2
  height weight
1 147.32    115
2 149.86    117
3 152.40    120
4 154.94    123
5 157.48    126
6 160.02    129
> transform(women1,cm=women1$height*2.54)
  height weight     cm
1     58    115 147.32
2     59    117 149.86
3     60    120 152.40
4     61    123 154.94
5     62    126 157.48
6     63    129 160.02

下面来介绍数据的排序

可以用sort()进行排序

Version:1.0 StartHTML:0000000107 EndHTML:0000005486 StartFragment:0000000127 EndFragment:0000005468

sort(x, decreasing = FALSE, na.last = NA, ...)

sort.int(x, partial = NULL, na.last = NA, decreasing = FALSE,
         method = c("auto", "shell", "quick", "radix"), index.return = FALSE)

Arguments

x

一个响亮,可以是数值型,复数型,字母或者逻辑型向量,或者是一个因子

decreasing

逻辑值. 升序还是降序

... 要传递给或从方法传递的参数,或(对于没有类的默认方法和对象)传递给sort.int的参数。
na.last 用于控制缺失值的方法。如果为真,则将数据中缺失的值放在最后;如果是假的,就把它们放在第一位;如果是NA,它们就被移除。
partial

空值 或者是部分排序的指标向量。

method 指定使用的算法的字符串。无法进行部分排序。可以缩写。
index.return 逻辑上指示是否也应该返回排序索引向量。方法==“基数”支持任何na。最后的模式和数据类型,以及其他方法当na。last = NA(默认值),并对非因素进行完全排序。
> rivers
  [1]  735  320  325  392  524  450 1459  135  465  600
 [11]  330  336  280  315  870  906  202  329  290 1000
 [21]  600  505 1450  840 1243  890  350  407  286  280
 [31]  525  720  390  250  327  230  265  850  210  630
 [41]  260  230  360  730  600  306  390  420  291  710
 [51]  340  217  281  352  259  250  470  680  570  350
 [61]  300  560  900  625  332 2348 1171 3710 2315 2533
 [71]  780  280  410  460  260  255  431  350  760  618
 [81]  338  981 1306  500  696  605  250  411 1054  735
 [91]  233  435  490  310  460  383  375 1270  545  445
[101] 1885  380  300  380  377  425  276  210  800  420
[111]  350  360  538 1100 1205  314  237  610  360  540
[121] 1038  424  310  300  444  301  268  620  215  652
[131]  900  525  246  360  529  500  720  270  430  671
[141] 1770
> sort(rivers)
  [1]  135  202  210  210  215  217  230  230  233  237
 [11]  246  250  250  250  255  259  260  260  265  268
 [21]  270  276  280  280  280  281  286  290  291  300
 [31]  300  300  301  306  310  310  314  315  320  325
 [41]  327  329  330  332  336  338  340  350  350  350
 [51]  350  352  360  360  360  360  375  377  380  380
 [61]  383  390  390  392  407  410  411  420  420  424
 [71]  425  430  431  435  444  445  450  460  460  465
 [81]  470  490  500  500  505  524  525  525  529  538
 [91]  540  545  560  570  600  600  600  605  610  618
[101]  620  625  630  652  671  680  696  710  720  720
[111]  730  735  735  760  780  800  840  850  870  890
[121]  900  900  906  981 1000 1038 1054 1100 1171 1205
[131] 1243 1270 1306 1450 1459 1770 1885 2315 2348 2533
[141] 3710
> 

同样也可以对字符串型向量进行排序,因为在电脑中字母是被储存为ASCLL码的

> sort(state.name)
 [1] "Alabama"        "Alaska"         "Arizona"       
 [4] "Arkansas"       "California"     "Colorado"      
 [7] "Connecticut"    "Delaware"       "Florida"       
[10] "Georgia"        "Hawaii"         "Idaho"         
[13] "Illinois"       "Indiana"        "Iowa"          
[16] "Kansas"         "Kentucky"       "Louisiana"     
[19] "Maine"          "Maryland"       "Massachusetts" 
[22] "Michigan"       "Minnesota"      "Mississippi"   
[25] "Missouri"       "Montana"        "Nebraska"      
[28] "Nevada"         "New Hampshire"  "New Jersey"    
[31] "New Mexico"     "New York"       "North Carolina"
[34] "North Dakota"   "Ohio"           "Oklahoma"      
[37] "Oregon"         "Pennsylvania"   "Rhode Island"  
[40] "South Carolina" "South Dakota"   "Tennessee"     
[43] "Texas"          "Utah"           "Vermont"       
[46] "Virginia"       "Washington"     "West Virginia" 
[49] "Wisconsin"      "Wyoming"      

还可以利用rev()达到向相反方向排序的效果

> rev(sort(rivers))
  [1] 3710 2533 2348 2315 1885 1770 1459 1450 1306 1270
 [11] 1243 1205 1171 1100 1054 1038 1000  981  906  900
 [21]  900  890  870  850  840  800  780  760  735  735
 [31]  730  720  720  710  696  680  671  652  630  625
 [41]  620  618  610  605  600  600  600  570  560  545
 [51]  540  538  529  525  525  524  505  500  500  490
 [61]  470  465  460  460  450  445  444  435  431  430
 [71]  425  424  420  420  411  410  407  392  390  390
 [81]  383  380  380  377  375  360  360  360  360  352
 [91]  350  350  350  350  340  338  336  332  330  329
[101]  327  325  320  315  314  310  310  306  301  300
[111]  300  300  291  290  286  281  280  280  280  276
[121]  270  268  265  260  260  259  255  250  250  250
[131]  246  237  233  230  230  217  215  210  210  202
[141]  135
> sort(rivers,decreasing = T)
  [1] 3710 2533 2348 2315 1885 1770 1459 1450 1306 1270
 [11] 1243 1205 1171 1100 1054 1038 1000  981  906  900
 [21]  900  890  870  850  840  800  780  760  735  735
 [31]  730  720  720  710  696  680  671  652  630  625
 [41]  620  618  610  605  600  600  600  570  560  545
 [51]  540  538  529  525  525  524  505  500  500  490
 [61]  470  465  460  460  450  445  444  435  431  430
 [71]  425  424  420  420  411  410  407  392  390  390
 [81]  383  380  380  377  375  360  360  360  360  352
 [91]  350  350  350  350  340  338  336  332  330  329
[101]  327  325  320  315  314  310  310  306  301  300
[111]  300  300  291  290  286  281  280  280  280  276
[121]  270  268  265  260  260  259  255  250  250  250
[131]  246  237  233  230  230  217  215  210  210  202
[141]  135

如果我们要对数据框进行排序呢?

当然我们可以像之前一样,先对一列进行排序,然后再索引

> a<-head(mtcars)
> a
                   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
> a[sort(rownames(a)),]
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
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
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
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

order()也可以对向量进行排序,但是返回的值时向量的位置,而不是向量元素的值

order(..., na.last = TRUE, decreasing = FALSE,
      method = c("auto", "shell", "radix"))

sort.list(x, partial = NULL, na.last = TRUE, decreasing = FALSE,
          method = c("auto", "shell", "quick", "radix"))

Arguments

...

一个数值型,复数型,字符型,或者逻辑型向量的序列

x

一个不可分向量

partial

向量部分排序. (不实现非空值)

decreasing

逻辑值. 降序还是升序排列, 基数方式, 它可以是一个长度等于参数个数的向量 ....其他方式, 长度一定是1.

na.last 用于控制缺失值的方式。如果为真,则将数据中缺失的值放在最后;如果是假,他们被放在第一位;如果是NA,它们就被移除
method 使用的方法:允许部分匹配。默认值(“auto”)表示短数值向量、整数向量、逻辑向量和因子的“基数”。否则,它意味着“shell”。有关“shell”、“quick”和“基数”方法的详细信息。
> sort(rivers)
  [1]  135  202  210  210  215  217  230  230  233  237  246  250
 [13]  250  250  255  259  260  260  265  268  270  276  280  280
 [25]  280  281  286  290  291  300  300  300  301  306  310  310
 [37]  314  315  320  325  327  329  330  332  336  338  340  350
 [49]  350  350  350  352  360  360  360  360  375  377  380  380
 [61]  383  390  390  392  407  410  411  420  420  424  425  430
 [73]  431  435  444  445  450  460  460  465  470  490  500  500
 [85]  505  524  525  525  529  538  540  545  560  570  600  600
 [97]  600  605  610  618  620  625  630  652  671  680  696  710
[109]  720  720  730  735  735  760  780  800  840  850  870  890
[121]  900  900  906  981 1000 1038 1054 1100 1171 1205 1243 1270
[133] 1306 1450 1459 1770 1885 2315 2348 2533 3710
> order(rivers)
  [1]   8  17  39 108 129  52  36  42  91 117 133  34  56  87  76
 [16]  55  41  75  37 127 138 107  13  30  72  53  29  19  49  61
 [31] 103 124 126  46  94 123 116  14   2   3  35  18  11  65  12
 [46]  81  51  27  60  78 111  54  43 112 119 134  97 105 102 104
 [61]  96  33  47   4  28  73  88  48 110 122 106 139  77  92 125
 [76] 100   6  74  95   9  57  93  84 136  22   5  31 132 135 113
 [91] 120  99  62  59  10  21  45  86 118  80 128  64  40 130 140
[106]  58  85  50  32 137  44   1  90  79  71 109  24  38  15  26
[121]  63 131  16  82  20 121  89 114  67 115  25  98  83  23   7
[136] 141 101  69  66  70  68

也正由于这样,在索引的时候可以直接用order()进行

> a
                   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
> a[order(a$mpg),]#注意不要忘记加逗号
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
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
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

我们随机抽取mtcars中的数据

> h<-sample(rownames(b),size=10,replace=F)
> b[h,]
                    X  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1           Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
11          Merc 280C 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
29     Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
31      Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
28       Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
15 Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
32         Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
19        Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
3          Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
22   Dodge Challenger 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

若我们想反向排列

可以

> q[order(-q$mpg),]
                    X  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
28       Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
19        Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
3          Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
32         Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
1           Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
11          Merc 280C 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
29     Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
22   Dodge Challenger 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
31      Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
15 Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
> q[order(q$mpg,decreasing = T),]
                    X  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
28       Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
19        Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
3          Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
32         Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
1           Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
11          Merc 280C 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
29     Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
22   Dodge Challenger 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
31      Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
15 Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4

也可以利用order()函数进行多条件排序,

> a
                   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
> subset(a,select=1:4)
                   mpg cyl disp  hp
Mazda RX4         21.0   6  160 110
Mazda RX4 Wag     21.0   6  160 110
Datsun 710        22.8   4  108  93
Hornet 4 Drive    21.4   6  258 110
Hornet Sportabout 18.7   8  360 175
Valiant           18.1   6  225 105
> b<-subset(a,select=1:4)
> b[order(a$mpg,a$disp),]
                   mpg cyl disp  hp
Valiant           18.1   6  225 105
Hornet Sportabout 18.7   8  360 175
Mazda RX4         21.0   6  160 110
Mazda RX4 Wag     21.0   6  160 110
Hornet 4 Drive    21.4   6  258 110
Datsun 710        22.8   4  108  93

 这样,在mpg相同的情况下,disp更小的排到了前面。

猜你喜欢

转载自blog.csdn.net/qq_43264642/article/details/88651053