在函数

时间:2017-04-27 12:33:37

标签: r sorting

我正在尝试创建一个函数,它接受一个数据帧和我想要作为参数排序的列。这就是我想出的:

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”来自何处以及如何删除它们?我做错了什么?我想降序排序。提前谢谢。

1 个答案:

答案 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来实现。获取输入向量后,它将转换为quosuresquosures),然后通过在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