我可以创建一个函数来按 R 中不同数据库的特定列名顺序对列进行排序吗?

Posted

技术标签:

【中文标题】我可以创建一个函数来按 R 中不同数据库的特定列名顺序对列进行排序吗?【英文标题】:Can I create a function to sort columns by specific column name order from different databases in R? 【发布时间】:2019-11-26 13:11:42 【问题描述】:

我正在尝试创建一个函数,该函数将根据我作为向量的特定列名顺序对数据框列进行排序。

我试过了:

order_df <- function(df, order_names)
  df <- df[, order_names]
  return(df)

还有

order_df <- function(df) 
  df <- df[, order_names]
  return(df)

其中 order_names 类似于 c("A", "C", "B", "D")A,B,C,D 是列名。

他们都给出了错误:Error: object 'df' not found

我基本上希望它这样做:Sort columns of a dataframe by column name

但是在一个函数中。

提前谢谢你

【问题讨论】:

订单是什么意思?对值排序还是仅对列排序? 你可以使用setcolorder() 如果您提供给它的所有参数都存在,那么第一个函数应该可以正常工作。该错误表明您没有任何名为df 的数据框。您如何调用此函数,即产生错误的代码是什么?导致错误的不是您在问题中显示的函数定义(除非您尝试在正文中运行行而不是整个函数定义) 您的代码对我来说看起来不错。您可能只是调用了order_df(df, order_names) 而没有先定义df 这是产生错误的地方:df &lt;- df[, order_names] 【参考方案1】:

dplyr:

library(dplyr)

order_df <- function(df, order_names)
  df %>% 
    dplyr::select(order_names,everything())

order_df(iris, c("Species","Sepal.Length"))

结果(截断):

        Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1       setosa          5.1         3.5          1.4         0.2
2       setosa          4.9         3.0          1.4         0.2
3       setosa          4.7         3.2          1.3         0.2
4       setosa          4.6         3.1          1.5         0.2

base:

order_df_2 <- function(df,order_names)
  other_names <- setdiff(names(df),order_names)
  df[,c(order_names,other_names)]

order_df_2(iris, c("Species","Sepal.Length"))

【讨论】:

你添加的结果看起来和我想要的完全一样,但是当我尝试时收到错误Error in UseMethod("select_") : no applicable method for 'select_' applied to an object of class "function" 你得到什么错误?没有你的数据很难知道。将您的数据的dput 添加到问题中。使用dput(head(df,n))。根据需要选择n。还请准确显示您运行的代码。 请查看我对已接受答案的评论。将来,请明确说明您想做什么。【参考方案2】:

首先运行下面的代码,它只是简单地定义了函数。

order_df <- function(df, order_names=c("A", "B", "C")) 
  df <- df[, order_names]
  return(df) 

该函数可以接受 2 个参数,但第二个参数是可选的,如果未提供,将采用默认值 c("A", "B", "C")

您的版本也很好,但使用默认值更标准。

现在,我们所做的就是定义函数order_df

您可以简单地在现有数据框上调用它,它就可以工作。如果您在 df 上调用它,但在全局环境中不存在 df,那么您应该不会对得到一个与此内容完全相同的错误感到惊讶。

# create a data.frame
example_df <- data.frame(
  A = 1:10,
  B = 11:20,
  K = 21:30,
  C = 31:40
)

# apply order_df
order_df(example_df)

【讨论】:

我认为这有点低效,因为它丢弃了其他列。无论如何,Op 对订单的定义似乎很模糊。他们应该将订单更改为select。您不能在丢弃元素的同时订购(我猜我的想法很幼稚)。 @NelsonGon 你是对的。只是试图让 OP 保持简单。无论如何,尚不清楚他们实际想要达到的目标。

以上是关于我可以创建一个函数来按 R 中不同数据库的特定列名顺序对列进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

在包含 is.na() 和中位数的 R 函数中传递列名

循环遍历 R 中列名的特定子集

在数据 R 中找不到列名时返回文本

在 R 函数中为子集插入列名时遇到问题

创建一个使用可以返回列名的 UDF 函数的 hiveQL 查询

在列名中使用别名创建表视图