【问题标题】:Sort Multiple Dataframes with function使用函数对多个数据框进行排序
【发布时间】:2019-06-17 20:59:15
【问题描述】:

我有多个数据帧(即 D1、D2、D3)。他们每个人都有不同的 colnames,我想对其进行排序。但我想创建一个函数。

例如,D1 有以下列的顺序 = 草莓、苹果、香蕉

D2 具有以下列的顺序 = x2, x4, x3 等等。 这是我要调整的内容:

Column_Sort = function(data) {

data = data[,sort(columnnames(data)]

return data}

有什么办法可以吗 1)创建一个将排序的函数 2)能够一次对多个数据集进行排序并返回

我知道我可以一个一个地做,但我有多个数据集,我想一次做。

【问题讨论】:

  • 您可以创建一个函数来获取您想要排序的数据和列名。
  • 您可以将所有数据框放在一个列表中,然后使用lapply() 一次性将您的函数应用于所有数据框。
  • new <- list(iris, mtcars); lapply(new, function(x){x <- x[,sort(colnames(x))]})

标签: r function sorting dataframe


【解决方案1】:

正如您所说,您有 2 个目标:1)对 1 数据框进行排序,以及 2)对多个数据框重复操作。这是一个很好的分离,它允许您首先为 1) 开发解决方案,然后为 2) 开发解决方案。

您的功能几乎就位。要获取列名,请使用colnames。其次,R 函数不需要return 语句,只需返回最后一个值。这也是一个非常常见的风格指南(至少在 tidyverse 包中)。总而言之,你的函数变成:

sortdf <- function(data) {
  data[,sort(colnames(data))]
}

对于 2),您可以将所有数据帧捆绑到一个列表中,然后使用 lapply:

lapply(list(D1, D2, D3), sortdf)

或者您可以创建第二个函数来为您执行此操作。无论哪种方式,你都必须决定你想要你的输出,因为lapply 和一个函数都只能返回一个对象——我们都可以将任意数量的 ting 捆绑到一个 list 对象中.所以让我们把 lapply 包装成一个函数:

sorter <- function(...) {
  lapply(list(...), sortdf)
}

在这里,我们使用省略号 ... 作为用户可能想要向函数抛出的任意数量参数的替代。理想情况下,这将是任意数量的 data.frame。为了处理可变大小的变量集,我们将其打包成一个列表。命令list(...) 将生成一个列表,其中包含与我们调用sorter完全相同 参数。所以,继续检查sorter 的输出。

唯一的问题是返回的列表未命名。你在哪个论点中加入了什么?我在这里展示了一个扩展版本,它命名了输出。检查它,看看你是否明白发生了什么。

sorter <- function(...) {
  m <- match.call()
  ret <- lapply(list(...), sortdf)
  if (is.null(names(ret))) {
    names(ret) <- make.names(m[-1])
  } else {
    names(ret)[names(ret) == ''] <- make.names(m[-1])[names(ret) == '']
  }
  ret
}

data("mtcars")
D1 <- mtcars[,c('cyl','drat','wt','am','qsec')]
sorter(D1, mtcars)
sorter(D1, b=data.frame(b='b',a='a'))

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2018-01-01
    • 2016-02-27
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多