我希望根据不同的列来订购数据框,一个转弯 . 我有一个字符向量,其中包含 order
应该基于的相关列名:
parameter <- c("market_value_LOCAL", "ep", "book_price", "sales_price", "dividend_yield",
"beta", "TOTAL_RATING_SCORE", "ENVIRONMENT", "SOCIAL", "GOVERNANCE")
我希望循环 parameter
中的名称并动态选择要用于 order
我的数据的列:
Q1_R1000_parameter <- Q1_R1000[order(Q1_R1000$parameter[X]), ]
其中 X
是 1:10
(因为我在 parameter
中有10个项目) .
为了使我的示例可重现,请考虑数据集 mtcars
以及存储在字符向量 cols
中的一些变量名称 . 当我尝试使用动态子集 cols
从 mtcars
中选择变量时,以与上面类似的方式( Q1_R1000$parameter[X]
),未选择该列:
cols <- c("cyl", "am")
mtcars$cols[1]
# NULL
6 回答
你不能用
$
进行那种子集化 . 在源代码(R/src/main/subset.c
)中,它声明:第二个论点?什么?!您必须意识到
$
,就像R中的其他所有内容(包括例如(
,+
,^
等)是一个函数,它接受参数并进行求值 .df$V1
可以改写为或者确实
但...
...例如永远不会工作,也不会在第二个参数中首先评估任何其他东西 . 您只能传递 never 评估的字符串 .
而是使用
[
(如果您想仅提取单个列作为向量,则使用[[
) .例如,
您可以在不使用循环的情况下执行排序,使用
do.call
构造对order
的调用 . 以下是可重现的示例:如果我理解正确,你有一个包含变量名称的向量,并希望遍历每个名称并按它们对数据框进行排序 . 如果是这样,这个例子应该为您说明一个解决方案 . 你的主要问题(完整的例子不完整,所以我不确定你还有什么可能遗漏)是它应该是
order(Q1_R1000[,parameter[X]])
而不是order(Q1_R1000$parameter[X])
,因为参数是一个外部对象,包含一个与a相对的变量名数据框的直接列(适用于$
时) .使用dplyr提供了一种简单的语法来排序数据帧
使用NSE版本允许动态构建排序列表可能很有用
由于某些CSV文件具有相同列的各种名称,因此存在类似问题 .
这是解决方案:
我写了一个函数来返回列表中的第一个有效列名,然后用它...
如果你想选择具有特定名称的列,那么就这样做
您可以在循环中运行它以及添加动态名称的反向方式,例如,如果A是数据框,而xyz是要命名为x的列,那么我喜欢这个
再次,这也可以循环添加