簡體   English   中英

如何按列給出數據框,將列名作為變量

[英]How to sort a dataframe by columns giving column names as a variable

我需要按幾列對數據框進行排序,並且我在變量中有列的名稱。 我的問題與問題有關,但在我的情況下,用於排序的列存儲在變量中,就像在另一個問題中一樣

我從第一個問題借用了數據框:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
dd
    b x y z
1  Hi A 8 1
2 Med D 3 1
3  Hi A 9 1
4 Low C 9 2

我需要做的是按z減少排序dd ,然后按b增加。 排序答案是:

dd[with(dd, order(-z, b)), ]

我有的是:

sort_list <- c("z","b")

從第二個問題我知道我能做到:

dd[do.call(order, dd[, sort_list]),]

但這只會讓我增加兩個變量的順序。 我無法弄清楚的是如何通過遞減順序來做到這一點。 我試過這個:

dd[do.call(order, list(dd[, sort_list]), decreasing = c(TRUE,FALSE)),]

這會產生錯誤,因為它假設decreasing參數只是另一個訂購項。

使用data.table訂單功能,您可以:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
                            levels = c("Low", "Med", "Hi"), ordered = TRUE),
                 x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
                 z = c(1, 1, 1, 2))


library(data.table)
sort_list <- c("z","b")
sort_order <- c(-1, 1)
setDT(dd)
setorderv(dd, sort_list, sort_order)
dd
#>      b x y z
#> 1: Low C 9 2
#> 2: Med D 3 1
#> 3:  Hi A 8 1
#> 4:  Hi A 9 1

這有效:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
sort_list <- c("z","b")
dd[order(-dd[,sort_list[1]], dd[,sort_list[2]]), ]
# or
dd[order(-dd[,sort_list["z"]], dd[,sort_list["b"]]), ]

如果那是令人討厭的類型,或變量名稱改變,或其他什么,你可以將它粘在一個函數(按正確的順序):

downup <- function(dat, sort_list){
    dat[order(-dat[,sort_list[1]], dat[,sort_list[2]]), ]
}
downup(dd)

這種幫助?

dplyr例子

library(dplyr)
sort_list <- c("z","b")
sort_order=c(TRUE,FALSE)
dd %>% arrange_(.dots=ifelse(sort_order,paste0("desc(",sort_list,")"),sort_list))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM