it-swarm-id.com

Bagaimana cara memesan bingkai data dengan satu kolom menurun dan satu kolom naik?

Saya memiliki bingkai data, yang terlihat seperti itu:

    P1  P2  P3  T1  T2  T3  I1  I2
1   2   3   5   52  43  61  6   "b"
2   6   4   3   72  NA  59  1   "a"
3   1   5   6   55  48  60  6   "f"
4   2   4   4   65  64  58  2   "b"

Saya ingin mengurutkannya dengan I1 dalam urutan menurun, dan baris dengan nilai yang sama di I1 dengan I2 dalam urutan naik, mendapatkan baris dalam urutan 1 3 4 2. Tetapi fungsi order tampaknya hanya mengambil satu argumen decreasing, yang kemudian TRUE atau FALSE untuk semua vektor pemesanan sekaligus. Bagaimana cara saya mendapatkan yang benar?

48
rumtscho

Saya menggunakan kode ini untuk menghasilkan output yang Anda inginkan. Apakah ini yang Anda kejar?

rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
2   3   5   52  43  61  6   b
6   4   3   72  NA  59  1   a
1   5   6   55  48  60  6   f
2   4   4   65  64  58  2   b"), header = TRUE)
rum$I2 <- as.character(rum$I2)
rum[order(rum$I1, rev(rum$I2), decreasing = TRUE), ]

  P1 P2 P3 T1 T2 T3 I1 I2
1  2  3  5 52 43 61  6  b
3  1  5  6 55 48 60  6  f
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a
44
Roman Luštrik

Saya menggunakan rank:

rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
2   3   5   52  43  61  6   b
6   4   3   72  NA  59  1   a
1   5   6   55  48  60  6   f
2   4   4   65  64  58  2   b
1   5   6   55  48  60  6   c"), header = TRUE)

> rum[order(rum$I1, -rank(rum$I2), decreasing = TRUE), ]
  P1 P2 P3 T1 T2 T3 I1 I2
1  2  3  5 52 43 61  6  b
5  1  5  6 55 48 60  6  c
3  1  5  6 55 48 60  6  f
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a
28
Michele

Saya khawatir jawaban Roman Luštrik salah. Ini bekerja pada input ini secara kebetulan. Pertimbangkan misalnya outputnya pada input yang sangat mirip (dengan baris tambahan yang mirip dengan baris asli 3 dengan "c" di kolom I2):

rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
2   3   5   52  43  61  6   b
6   4   3   72  NA  59  1   a
1   5   6   55  48  60  6   f
2   4   4   65  64  58  2   b
1   5   6   55  48  60  6   c"), header = TRUE)

rum$I2 <- as.character(rum$I2)
rum[order(rum$I1, rev(rum$I2), decreasing = TRUE), ]

  P1 P2 P3 T1 T2 T3 I1 I2
3  1  5  6 55 48 60  6  f
1  2  3  5 52 43 61  6  b
5  1  5  6 55 48 60  6  c
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a

Ini bukan hasil yang diinginkan: tiga nilai pertama I2 adalah f b c dari pada b c f, yang diharapkan karena jenis sekunder adalah I2 dalam urutan menaik.

Untuk mendapatkan urutan terbalik I2, Anda ingin nilai besar menjadi kecil dan sebaliknya. Untuk nilai numerik dikalikan dengan -1 akan melakukannya, tetapi untuk karakter sedikit lebih rumit. Solusi umum untuk karakter/string adalah melalui faktor, membalikkan level (untuk membuat nilai besar menjadi kecil dan nilai kecil menjadi besar) dan mengubah faktor kembali ke karakter:

rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
2   3   5   52  43  61  6   b
6   4   3   72  NA  59  1   a
1   5   6   55  48  60  6   f
2   4   4   65  64  58  2   b
1   5   6   55  48  60  6   c"), header = TRUE)

f=factor(rum$I2)
levels(f) = rev(levels(f))
rum[order(rum$I1, as.character(f), decreasing = TRUE), ]

  P1 P2 P3 T1 T2 T3 I1 I2
1  2  3  5 52 43 61  6  b
5  1  5  6 55 48 60  6  c
3  1  5  6 55 48 60  6  f
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a
23
dudusan

Biarkan df menjadi bingkai data dengan 2 bidang A dan B

Kasus 1: jika bidang Anda A dan B adalah angka

df[order(df[,1],df[,2]),] - sorts fields A and B in ascending order
df[order(df[,1],-df[,2]),] - sorts fields A in ascending and B in descending order
prioritas diberikan kepada A.

Kasus 2: jika bidang A atau B adalah faktor atau karakter non numerik

Dalam kasus kami jika B adalah karakter dan kami ingin mengurutkan dalam urutan terbalik
df[order(df[,1],-as.numeric(as.factor(df[,2]))),] -> this sorts field A(numerical) in ascending and field B(character) in descending.
prioritas diberikan kepada A.

The idea is that you can apply -sign in order function ony on numericals. So for sorting character strings in descending order you have to coerce them to numericals.

4
ayush1723

Pengurutan default stabil, jadi kami mengurutkan dua kali: Pertama dengan kunci minor, lalu oleh kunci utama

rum1 <- rum[order(rum$I2, decreasing = FALSE),]
rum2 <- rum1[order(rum1$I1, decreasing = TRUE),]
3
Rick

Sederhana tanpa peringkat:

rum[order(rum$I1, -rum$I2, decreasing = TRUE), ]
2
Somnath Kadam
    library(dplyr)
    library(tidyr)
    #supposing you want to arrange column 'c' in descending order and 'd' in ascending order. name of data frame is df
    ## first doing descending
    df<-arrange(df,desc(c))
    ## then the ascending order of col 'd;
    df <-arrange(df,d)
2
Pranay Aryal
rum[order(rum$T1, -rum$T2 ), ]
1
Dmitri B

Dalam contoh @ dudusan, Anda juga bisa membalik urutan I1, lalu mengurutkan naik:

> rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
+   2   3   5   52  43  61  6   b
+   6   4   3   72  NA  59  1   a
+   1   5   6   55  48  60  6   f
+   2   4   4   65  64  58  2   b
+   1   5   6   55  48  60  6   c"), header = TRUE)
> f=factor(rum$I1)   
> levels(f) <- sort(levels(f), decreasing = TRUE)
> rum[order(as.character(f), rum$I2), ]
  P1 P2 P3 T1 T2 T3 I1 I2
1  2  3  5 52 43 61  6  b
5  1  5  6 55 48 60  6  c
3  1  5  6 55 48 60  6  f
4  2  4  4 65 64 58  2  b
2  6  4  3 72 NA 59  1  a
> 

Ini sepertinya sedikit lebih pendek, Anda tidak membalik urutan I2 dua kali.

0
Dries Knottnerus

Cara yang benar adalah:

rum[order(rum$T1, rum$T2, decreasing=c(T,F)), ]
0
dinh