R:在 data.table 中使用 get() 动态引用 xlsx namedregion 中的列名

R: Dynamic reference of column name from xlsx namedregion using get() in data.table

提问人:Mohit 提问时间:11/7/2023 最后编辑:r2evansMohit 更新时间:11/8/2023 访问量:103

问:

假设这是我的数据,它只是一个样本,而不是原始数据。

dark = data.table(cake = c(1, 2, 3, 4, 5, 6, 7, "c1", "c1", "c1", "c2", "c2", "c3", "c3", "c3", "c3"), note = c("a", "b", "c", "d", "e", "f", "g", "h", "h", "i", "j", "j", "k", "l", "m", "m"), walk = c(183, 789, 753, 130, 126, 44, 325, 710, 307, 264, 708, 769, 742, 559, 181, 138))
road <- data.table(rab = c(0, 10, 50, 100, 120, 150, 160, 200, 400, 450, 550, 560, 700, 800, 900), cat = c("t",5,7,"y","t",1,2,4,"t","y","u","u","u",6,7))

这是需要做的事情。

dark[road,"menti" :=.(i.cat) ,   on = .(walk >= rab) ]

我对这段代码非常满意。这非常有效。

现在的问题是,如果我尝试对列进行动态引用,代码会抛出错误。walk

例如,以下两个代码都无法运行。

dark[road,"menti" :=.(i.cat) ,   on = .(get(fromexcel) >= rab) ]
dark[road,"menti" :=.(i.cat) ,   on = .(eval(parse(text = fromexcel)) >= rab) ]

这是我当前使用的代码。fromexcel

> library(openxlsx)
> fromexcel<-read.xlsx(xlsxFile = "//dfgygsad/Book1.xlsx",sheet = "Sheet2",namedRegion = "field",colNames = FALSE)[,1]
> fromexcel
[1] "walk"

错误是

Error in colnamesInt(x, names(on), check_dups = FALSE) : 
  argument specifying columns specify non existing column(s): cols[1]='get(fromexcel)'

感谢您的答案是否可以在不更改代码的情况下解决此问题,而只需使此动态引用起作用。

r 数据表

评论

0赞 r2evans 11/7/2023
仅供参考,我删除了 openxlsx 标签,因为它与问题或解决方案无关。也就是说,可以自我定义,从一个闪亮的应用程序中,从某个地方的网页上抓取,没关系。如果您觉得这是错误的,我很抱歉,请随时将其添加回来。fromexceltextInput
0赞 Mohit 11/7/2023
不用担心。谢谢。但是,我仍然在寻找更好的答案。

答:

3赞 r2evans 11/7/2023 #1

您可以在该部分中使用字符串。on=

# original, for reference
dark[road,"menti" :=.(i.cat), on = .(walk >= rab) ]
fromexcel
# [1] "walk"
dark[road,"menti2" :=.(i.cat), on = paste(fromexcel, ">= rab") ]
#       cake   note  walk  menti menti2
#     <char> <char> <num> <char> <char>
#  1:      1      a   183      2      2
#  2:      2      b   789      u      u
#  3:      3      c   753      u      u
#  4:      4      d   130      t      t
#  5:      5      e   126      t      t
#  6:      6      f    44      5      5
#  7:      7      g   325      4      4
#  8:     c1      h   710      u      u
#  9:     c1      h   307      4      4
# 10:     c1      i   264      4      4
# 11:     c2      j   708      u      u
# 12:     c2      j   769      u      u
# 13:     c3      k   742      u      u
# 14:     c3      l   559      u      u
# 15:     c3      m   181      2      2
# 16:     c3      m   138      t      t

使用符号(例如,)的概念很好,但并不总是方便,因此,您搜索使用.但是,我相信字符串能够控制支持的所有类型的连接,无论是同名的相等性 ()、不同名称的相等性 () 还是不等式 (),并且将在两个要连接的数据集的上下文中对它们进行内部评估。由于它们都是字符串,因此它们都可以以编程方式形成。on = .(walk >= rab)get(.)data.table"cake""cake" == "cake2""walk >= rab"data.table

但重要的是,不能同时使用符号字符串,您必须同时使用其中之一。(我想不出使用字符串是非最佳原因,因为如果你写,只需要再写两个字符。walk >= rab"walk >= rab"

评论

0赞 Mohit 11/7/2023
谢谢埃文斯,如果我希望同时动态引用怎么样。rab
1赞 r2evans 11/7/2023
不知道你为什么认为是必需的,对我来说它失败了.我最近尝试的每个通常使用符号(即 NSE)的连接,当我将它们转换为表示相同的字符串时,它们都会起作用。我不知道该怎么说:会失败,这是错误的; 这将是加入三对(不是您的问题的一部分)应该可以正常工作。on=.(...)argument specifying columns specify non existing column(s): cols[1]='paste(fromexcel, "'on = .(...)on=.(paste(...))on=c(paste(...), paste(...), paste(...))
1赞 r2evans 11/7/2023
“如果我尝试对列 walk 进行动态引用,代码会抛出错误”......我的代码修复了这个问题。如果您的真实数据出现其他问题,除非您能够更新您的问题,以便我的代码也因您的数据而失败,否则我无能为力。
1赞 r2evans 11/8/2023
制作字符向量。怎么样或.不管你如何形成其中任何一个(使用、或只是向量索引),一个完整的字符向量总是并且仍然有效。on = c("cake", "walk >= rab")on = c("cake == cake", "walk >= rab")pastesprintf
1赞 r2evans 11/8/2023
换一种说法:显然有时符号(即 )不方便,因此您尝试使用 .但是,我不知道字符向量 () 何时无法涵盖 data.table 支持的每种类型的连接,无论是完全相同的名称(或更详细)、不同名称的相等 () 或不等式 ()。这些都是在两个数据集的上下文中内部解析/计算的字符串,字符串可以通过编程方式形成。on = .(cake, walk >= rab)geton = c("cake", "walk >= rab")"cake""cake == cake""cake1 == cake2""walk >= rab"data.table