提问人:Mohit 提问时间:11/7/2023 最后编辑:r2evansMohit 更新时间:11/8/2023 访问量:103
R:在 data.table 中使用 get() 动态引用 xlsx namedregion 中的列名
R: Dynamic reference of column name from xlsx namedregion using get() in data.table
问:
假设这是我的数据,它只是一个样本,而不是原始数据。
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)'
感谢您的答案是否可以在不更改代码的情况下解决此问题,而只需使此动态引用起作用。
答:
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")
paste
sprintf
1赞
r2evans
11/8/2023
换一种说法:显然有时符号(即 )不方便,因此您尝试使用 .但是,我不知道字符向量 () 何时无法涵盖 data.table
支持的每种类型的连接,无论是完全相同的名称(或更详细)、不同名称的相等 () 或不等式 ()。这些都是在两个数据集的上下文中内部解析/计算的字符串,字符串可以通过编程方式形成。on = .(cake, walk >= rab)
get
on = c("cake", "walk >= rab")
"cake"
"cake == cake"
"cake1 == cake2"
"walk >= rab"
data.table
评论
fromexcel
textInput