R 할줄 R지? #10 - 데이터 정렬하기

    데이터 정렬을 위해 아이리스(Iris) 데이터를 이용하여 정렬을 해보고자 한다. 아이리스는 이제는 매우 잘 알겠지만

    > head(iris)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa

    이와같이 꽃받침(Sepal)과 꽃잎(Petal)의 넓이, 길이로 구성이 되어 있다.

    정렬 실습을 위해서 "Sepal.Length" 즉, 꽃받침 길이만 가지고 정렬을 해보고자 한다.

     

     

    오름차순하기

    오름차순을 할 때는 sort()라는 함수를 호출하여 쉽게 정렬을 할 수 있다.

    > sepalLength <- iris[,"Sepal.Length"]
    > sepalLength
      [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6
     [24] 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8
     [47] 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2
     [70] 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1
     [93] 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8
    [116] 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4
    [139] 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
    > sort(sepalLength)
      [1] 4.3 4.4 4.4 4.4 4.5 4.6 4.6 4.6 4.6 4.7 4.7 4.8 4.8 4.8 4.8 4.8 4.9 4.9 4.9 4.9 4.9 4.9 5.0
     [24] 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.2 5.2 5.2 5.2 5.3
     [47] 5.4 5.4 5.4 5.4 5.4 5.4 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.6 5.6 5.6 5.6 5.6 5.6 5.7 5.7 5.7 5.7
     [70] 5.7 5.7 5.7 5.7 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.9 5.9 5.9 6.0 6.0 6.0 6.0 6.0 6.0 6.1 6.1 6.1
     [93] 6.1 6.1 6.1 6.2 6.2 6.2 6.2 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4
    [116] 6.5 6.5 6.5 6.5 6.5 6.6 6.6 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.9 6.9 6.9 6.9 7.0
    [139] 7.1 7.2 7.2 7.2 7.3 7.4 7.6 7.7 7.7 7.7 7.7 7.9
    > 

    아이리스의 Sepal.length 데이터를 별도로 추출하여 sepalLength라는 변수에 저장하였고, sort(sepalLength)로 오름차순을 실행하였다. 그러나 이런 방식은 전체적으로 데이터를 파악하기 힘들다. 해당 되는 값이 어느 꽃과 매칭이 되는지 알 수 없기 때문이다. 즉, 행렬 기반의 데이터를 정렬해야 의미가 있기에 2차원 데이터를 위한 정렬 함수를 써보도록 한다.

     

    order() 함수를 사용하면 값이 정렬이 되지만, 값이 아니라 인덱스가 리턴이 된다.

    > order(iris$Sepal.Length)
      [1]  14   9  39  43  42   4   7  23  48   3  30  12  13  25  31  46   2  10  35  38  58 107   5
     [24]   8  26  27  36  41  44  50  61  94   1  18  20  22  24  40  45  47  99  28  29  33  60  49
     [47]   6  11  17  21  32  85  34  37  54  81  82  90  91  65  67  70  89  95 122  16  19  56  80
     [70]  96  97 100 114  15  68  83  93 102 115 143  62  71 150  63  79  84  86 120 139  64  72  74
     [93]  92 128 135  69  98 127 149  57  73  88 101 104 124 134 137 147  52  75 112 116 129 133 138
    [116]  55 105 111 117 148  59  76  66  78  87 109 125 141 145 146  77 113 144  53 121 140 142  51
    [139] 103 110 126 130 108 131 106 118 119 123 136 132

     

    이 데이터를 보면 가장 작은 값이 14이고, 큰 값이 132번째라고 나오는데 해당 위치의 IRIS 데이터는 다음과 같다

    14           4.3         3.0          1.1         0.1     setosa
    132          7.9         3.8          6.4         2.0  virginica

    보는것과 같이 가장 낮은 값과 가장 높은 값인걸 보니 정상적으로 인덱스 값을 리턴해주고 있는 것을 알 수 있다. 이 인덱스 값을 응용해서 전체 데이터를 출력해보자

     

     

    > iris[c(order(iris$Sepal.Length)),]
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    14           4.3         3.0          1.1         0.1     setosa
    9            4.4         2.9          1.4         0.2     setosa
    39           4.4         3.0          1.3         0.2     setosa
    43           4.4         3.2          1.3         0.2     setosa
    42           4.5         2.3          1.3         0.3     setosa
    4            4.6         3.1          1.5         0.2     setosa
    7            4.6         3.4          1.4         0.3     setosa
    23           4.6         3.6          1.0         0.2     setosa
    48           4.6         3.2          1.4         0.2     setosa
    3            4.7         3.2          1.3         0.2     setosa
    30           4.7         3.2          1.6         0.2     setosa
    12           4.8         3.4          1.6         0.2     setosa
    13           4.8         3.0          1.4         0.1     setosa
    25           4.8         3.4          1.9         0.2     setosa
    31           4.8         3.1          1.6         0.2     setosa
    46           4.8         3.0          1.4         0.3     setosa
    2            4.9         3.0          1.4         0.2     setosa
    10           4.9         3.1          1.5         0.1     setosa
    35           4.9         3.1          1.5         0.2     setosa
    38           4.9         3.6          1.4         0.1     setosa
    58           4.9         2.4          3.3         1.0 versicolor
    107          4.9         2.5          4.5         1.7  virginica
    5            5.0         3.6          1.4         0.2     setosa
    8            5.0         3.4          1.5         0.2     setosa
    26           5.0         3.0          1.6         0.2     setosa
    27           5.0         3.4          1.6         0.4     setosa
    36           5.0         3.2          1.2         0.2     setosa
    41           5.0         3.5          1.3         0.3     setosa
    44           5.0         3.5          1.6         0.6     setosa
    50           5.0         3.3          1.4         0.2     setosa
    61           5.0         2.0          3.5         1.0 versicolor
    94           5.0         2.3          3.3         1.0 versicolor
    1            5.1         3.5          1.4         0.2     setosa
    18           5.1         3.5          1.4         0.3     setosa
    20           5.1         3.8          1.5         0.3     setosa
    22           5.1         3.7          1.5         0.4     setosa
    24           5.1         3.3          1.7         0.5     setosa
    40           5.1         3.4          1.5         0.2     setosa
    45           5.1         3.8          1.9         0.4     setosa
    47           5.1         3.8          1.6         0.2     setosa
    99           5.1         2.5          3.0         1.1 versicolor
    28           5.2         3.5          1.5         0.2     setosa
    29           5.2         3.4          1.4         0.2     setosa
    33           5.2         4.1          1.5         0.1     setosa
    60           5.2         2.7          3.9         1.4 versicolor
    49           5.3         3.7          1.5         0.2     setosa
    6            5.4         3.9          1.7         0.4     setosa
    11           5.4         3.7          1.5         0.2     setosa
    17           5.4         3.9          1.3         0.4     setosa
    21           5.4         3.4          1.7         0.2     setosa
    32           5.4         3.4          1.5         0.4     setosa
    85           5.4         3.0          4.5         1.5 versicolor
    34           5.5         4.2          1.4         0.2     setosa
    37           5.5         3.5          1.3         0.2     setosa
    54           5.5         2.3          4.0         1.3 versicolor
    81           5.5         2.4          3.8         1.1 versicolor
    82           5.5         2.4          3.7         1.0 versicolor
    90           5.5         2.5          4.0         1.3 versicolor
    91           5.5         2.6          4.4         1.2 versicolor
    65           5.6         2.9          3.6         1.3 versicolor
    67           5.6         3.0          4.5         1.5 versicolor
    70           5.6         2.5          3.9         1.1 versicolor
    89           5.6         3.0          4.1         1.3 versicolor
    95           5.6         2.7          4.2         1.3 versicolor
    122          5.6         2.8          4.9         2.0  virginica
    16           5.7         4.4          1.5         0.4     setosa
    19           5.7         3.8          1.7         0.3     setosa
    56           5.7         2.8          4.5         1.3 versicolor
    80           5.7         2.6          3.5         1.0 versicolor
    96           5.7         3.0          4.2         1.2 versicolor
    97           5.7         2.9          4.2         1.3 versicolor
    100          5.7         2.8          4.1         1.3 versicolor
    114          5.7         2.5          5.0         2.0  virginica
    15           5.8         4.0          1.2         0.2     setosa
    68           5.8         2.7          4.1         1.0 versicolor
    83           5.8         2.7          3.9         1.2 versicolor
    93           5.8         2.6          4.0         1.2 versicolor
    102          5.8         2.7          5.1         1.9  virginica
    115          5.8         2.8          5.1         2.4  virginica
    143          5.8         2.7          5.1         1.9  virginica
    62           5.9         3.0          4.2         1.5 versicolor
    71           5.9         3.2          4.8         1.8 versicolor
    150          5.9         3.0          5.1         1.8  virginica
    63           6.0         2.2          4.0         1.0 versicolor
    79           6.0         2.9          4.5         1.5 versicolor
    84           6.0         2.7          5.1         1.6 versicolor
    86           6.0         3.4          4.5         1.6 versicolor
    120          6.0         2.2          5.0         1.5  virginica
    139          6.0         3.0          4.8         1.8  virginica
    64           6.1         2.9          4.7         1.4 versicolor
    72           6.1         2.8          4.0         1.3 versicolor
    74           6.1         2.8          4.7         1.2 versicolor
    92           6.1         3.0          4.6         1.4 versicolor
    128          6.1         3.0          4.9         1.8  virginica
    135          6.1         2.6          5.6         1.4  virginica
    69           6.2         2.2          4.5         1.5 versicolor
    98           6.2         2.9          4.3         1.3 versicolor
    127          6.2         2.8          4.8         1.8  virginica
    149          6.2         3.4          5.4         2.3  virginica
    57           6.3         3.3          4.7         1.6 versicolor
    73           6.3         2.5          4.9         1.5 versicolor
    88           6.3         2.3          4.4         1.3 versicolor
    101          6.3         3.3          6.0         2.5  virginica
    104          6.3         2.9          5.6         1.8  virginica
    124          6.3         2.7          4.9         1.8  virginica
    134          6.3         2.8          5.1         1.5  virginica
    137          6.3         3.4          5.6         2.4  virginica
    147          6.3         2.5          5.0         1.9  virginica
    52           6.4         3.2          4.5         1.5 versicolor
    75           6.4         2.9          4.3         1.3 versicolor
    112          6.4         2.7          5.3         1.9  virginica
    116          6.4         3.2          5.3         2.3  virginica
    129          6.4         2.8          5.6         2.1  virginica
    133          6.4         2.8          5.6         2.2  virginica
    138          6.4         3.1          5.5         1.8  virginica
    55           6.5         2.8          4.6         1.5 versicolor
    105          6.5         3.0          5.8         2.2  virginica
    111          6.5         3.2          5.1         2.0  virginica
    117          6.5         3.0          5.5         1.8  virginica
    148          6.5         3.0          5.2         2.0  virginica
    59           6.6         2.9          4.6         1.3 versicolor
    76           6.6         3.0          4.4         1.4 versicolor
    66           6.7         3.1          4.4         1.4 versicolor
    78           6.7         3.0          5.0         1.7 versicolor
    87           6.7         3.1          4.7         1.5 versicolor
    109          6.7         2.5          5.8         1.8  virginica
    125          6.7         3.3          5.7         2.1  virginica
    141          6.7         3.1          5.6         2.4  virginica
    145          6.7         3.3          5.7         2.5  virginica
    146          6.7         3.0          5.2         2.3  virginica
    77           6.8         2.8          4.8         1.4 versicolor
    113          6.8         3.0          5.5         2.1  virginica
    144          6.8         3.2          5.9         2.3  virginica
    53           6.9         3.1          4.9         1.5 versicolor
    121          6.9         3.2          5.7         2.3  virginica
    140          6.9         3.1          5.4         2.1  virginica
    142          6.9         3.1          5.1         2.3  virginica
    51           7.0         3.2          4.7         1.4 versicolor
    103          7.1         3.0          5.9         2.1  virginica
    110          7.2         3.6          6.1         2.5  virginica
    126          7.2         3.2          6.0         1.8  virginica
    130          7.2         3.0          5.8         1.6  virginica
    108          7.3         2.9          6.3         1.8  virginica
    131          7.4         2.8          6.1         1.9  virginica
    106          7.6         3.0          6.6         2.1  virginica
    118          7.7         3.8          6.7         2.2  virginica
    119          7.7         2.6          6.9         2.3  virginica
    123          7.7         2.8          6.7         2.0  virginica
    136          7.7         3.0          6.1         2.3  virginica
    132          7.9         3.8          6.4         2.0  virginica

    이와 같이 IRIS값이 Sepal.Length 기반으로 오름차순 정렬이 되었다.

     

    내림차순하기

    내림차순은 오름차순의 값을 살짝만 틀어주면 된다.

    sort 함수의 Help 결과

    보다시피 사용 방법은 sort(변수, decreasing 여부)이다. Default를 FALSE이기 때문에 오름차순이고, decreasing=TRUE 혹은 T를 넣게 되면 내림차순을 하게 된다.

    > sort(iris[,"Sepal.Length"], decreasing = T)
      [1] 7.9 7.7 7.7 7.7 7.7 7.6 7.4 7.3 7.2 7.2 7.2 7.1 7.0 6.9 6.9 6.9 6.9 6.8 6.8 6.8 6.7 6.7 6.7
     [24] 6.7 6.7 6.7 6.7 6.7 6.6 6.6 6.5 6.5 6.5 6.5 6.5 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.3 6.3 6.3 6.3
     [47] 6.3 6.3 6.3 6.3 6.3 6.2 6.2 6.2 6.2 6.1 6.1 6.1 6.1 6.1 6.1 6.0 6.0 6.0 6.0 6.0 6.0 5.9 5.9
     [70] 5.9 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.6 5.6 5.6 5.6 5.6 5.6 5.5
     [93] 5.5 5.5 5.5 5.5 5.5 5.5 5.4 5.4 5.4 5.4 5.4 5.4 5.3 5.2 5.2 5.2 5.2 5.1 5.1 5.1 5.1 5.1 5.1
    [116] 5.1 5.1 5.1 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.9 4.9 4.9 4.9 4.9 4.9 4.8 4.8 4.8 4.8
    [139] 4.8 4.7 4.7 4.6 4.6 4.6 4.6 4.5 4.4 4.4 4.4 4.3
    > sort(iris[,"Sepal.Length"], decreasing = TRUE)
      [1] 7.9 7.7 7.7 7.7 7.7 7.6 7.4 7.3 7.2 7.2 7.2 7.1 7.0 6.9 6.9 6.9 6.9 6.8 6.8 6.8 6.7 6.7 6.7
     [24] 6.7 6.7 6.7 6.7 6.7 6.6 6.6 6.5 6.5 6.5 6.5 6.5 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.3 6.3 6.3 6.3
     [47] 6.3 6.3 6.3 6.3 6.3 6.2 6.2 6.2 6.2 6.1 6.1 6.1 6.1 6.1 6.1 6.0 6.0 6.0 6.0 6.0 6.0 5.9 5.9
     [70] 5.9 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.6 5.6 5.6 5.6 5.6 5.6 5.5
     [93] 5.5 5.5 5.5 5.5 5.5 5.5 5.4 5.4 5.4 5.4 5.4 5.4 5.3 5.2 5.2 5.2 5.2 5.1 5.1 5.1 5.1 5.1 5.1
    [116] 5.1 5.1 5.1 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.9 4.9 4.9 4.9 4.9 4.9 4.8 4.8 4.8 4.8
    [139] 4.8 4.7 4.7 4.6 4.6 4.6 4.6 4.5 4.4 4.4 4.4 4.3

    T 혹은 TRUE 둘다 써도 TRUE로 인지하기 때문에 편한 방법을 쓰면 된다. 그럼 이번에는 데이터가 모두 출력되게 해본다

     

    order 입력시 나오는 헬프화면

    order도 마찬가지로 decreasing 인자값이 존재한다. 

    > iris[c(order(iris$Sepal.Length, decreasing = T)),]
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    132          7.9         3.8          6.4         2.0  virginica
    118          7.7         3.8          6.7         2.2  virginica
    119          7.7         2.6          6.9         2.3  virginica
    123          7.7         2.8          6.7         2.0  virginica
    136          7.7         3.0          6.1         2.3  virginica
    106          7.6         3.0          6.6         2.1  virginica
    131          7.4         2.8          6.1         1.9  virginica
    108          7.3         2.9          6.3         1.8  virginica
    110          7.2         3.6          6.1         2.5  virginica
    ...생략

    이와같이 decreasing = T 혹은 TRUE를 쓰면, 내림차순으로 데이터를 모두 출력할 수 있게 된다.

    댓글

    Designed by JB FACTORY