我希望根据不同的列来订购数据框,一个转弯.我有一个字符向量,其中的相关列名order应该基于:
parameter <- c("market_value_LOCAL", "ep", "book_price", "sales_price", "dividend_yield",
"beta", "TOTAL_RATING_SCORE", "ENVIRONMENT", "SOCIAL", "GOVERNANCE")
Run Code Online (Sandbox Code Playgroud)
我想循环遍历名称parameter并动态选择要用于order我的数据的列:
Q1_R1000_parameter <- Q1_R1000[order(Q1_R1000$parameter[X]), ]
Run Code Online (Sandbox Code Playgroud)
这里X是1:10(因为我有10个项目parameter).
为了使我的示例可重现,请考虑mtcars存储在字符向量中的数据集和一些变量名称cols.当我尝试mtcars使用动态子集选择变量时cols,以与上面(Q1_R1000$parameter[X])相似的方式,未选择该列:
cols <- c("cyl", "am")
mtcars$cols[1]
# NULL
Run Code Online (Sandbox Code Playgroud) data.table如果变量名存储在字符向量中,如何引用变量?例如,这适用于data.frame:
df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
# col1
# 1 4
# 2 5
# 3 6
Run Code Online (Sandbox Code Playgroud)
如何使用或不使用:=表示法对data.table执行相同的操作?显而易见的事情是dt[ , list(colname)]行不通的(我也没想到).
预读
我在 SO 上浏览了一些材料:
在得到我以前的问题的完美答案后,我试图一劳永逸地了解如何规范地处理data.tables函数。
潜在问题
我最终想要的是创建一个函数,该函数将一些R表达式作为输入并在 a 的上下文中对它们进行评估data.table(在 thei和jpart 中)。引用的答案告诉我,get/eval/substitute如果我的输入变得比单列更复杂,我必须使用某种组合(在这种情况下,我可以接受..string或with = FALSE方法 [1])。
我的真实数据相当大,所以我担心计算时间。
最终,如果我想拥有完全的灵活性(即传递表达式而不是裸列名称),我明白我必须采取一种eval方法:
代码讲了一千个字,所以让我们来说明我到目前为止的发现:
设置
library(data.table)
iris <- copy(iris)
setDT(iris)
Run Code Online (Sandbox Code Playgroud)
主力功能
my_fun <- function(my_i, my_j, option_sel = 1, my_data = iris, by = NULL) {
switch(option_sel,
{
## option 1 - base R deparse
my_data[eval(parse(text = deparse(substitute(my_i)))),
eval(parse(text …Run Code Online (Sandbox Code Playgroud)