我正在尝试创建一个函数,它接受一个数据帧和我想要作为参数排序的列。这就是我想出的:
sortDf <- function(df, columns){
df <- df[order(df[,columns]),]
return(df)
}
这是我的用例:
set.seed(24)
dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5)
df <- as.data.frame(dataset)
sortedDf <- sortDf(df, c('V1', 'V2'))
我怎么能得到这个结果:
V1 V2 V3 V4 V5
3 1 1 5 3 4
5 1 5 2 5 2
NA NA NA NA NA NA
NA.1 NA NA NA NA NA
NA.2 NA NA NA NA NA
NA.3 NA NA NA NA NA
1 5 2 1 2 5
4 5 2 1 2 1
NA.4 NA NA NA NA NA
2 NA 4 NA 1 4
数据框有点排序但“NA”来自何处以及如何删除它们?我做错了什么?我想降序排序。提前谢谢。
答案 0 :(得分:3)
我们可以创建不同的功能
2
在OP的代码中, f1 <- function(dat, cols){
dat[do.call(order, dat[cols]),]
}
f1(df, c("V1", "V2"))
# V1 V2 V3 V4 V5
#2 1 1 2 1 3
#1 1 5 3 5 NA
#5 3 1 1 NA 1
#4 3 4 4 3 NA
#3 4 4 4 NA 4
应用于order
而不是data.frame
。它既可以单独使用,也可以在vector
范围内使用,即
do.call
给出与OP代码相同的结果。因此,它可以单独提及列(当列数更多时这不容易)或使用df[order(df$V1, df$V2),]
# V1 V2 V3 V4 V5
#2 1 1 2 1 3
#1 1 5 3 5 NA
#5 3 1 1 NA 1
#4 3 4 4 3 NA
#3 4 4 4 NA 4
。
这也可以使用do.call
的devel版本(即将发布dplyr
)和0.6.0
来实现。获取输入向量后,它将转换为quosures
(quosures
),然后通过在parse_quosures
中取消引用(!!!
)进行评估
arrange
library(dplyr)
f2 <- function(dat, cols){
cols <- rlang::parse_quosures(paste(cols, collapse=";"))
dat %>%
arrange(!!! cols)
}
f2(df, c("V1", "V2"))
# V1 V2 V3 V4 V5
#1 1 1 2 1 3
#2 1 5 3 5 NA
#3 3 1 1 NA 1
#4 3 4 4 3 NA
#5 4 4 4 NA 4