我可以创建一个函数来按 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 <- 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 中不同数据库的特定列名顺序对列进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章