![](/img/trans.png)
[英]add new columns to a dataframe giving each column different names in a loop
[英]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.