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

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) ]

我对这个代码非常满意.这个很好用.

现在的问题是,如果我try 对列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)'

如果您的答案可以在不更改代码的情况下解决这个问题,而只是让这个动态参考起作用,我将不胜感激.

推荐答案

您可以在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

使用symbols(例如,on = .(walk >= rab))的概念很好,但并不总是很方便,因此可以搜索使用get(.).然而,我相信strings能够控制data.table支持的所有类型的联接,无论是同名相等("cake")、不同名相等("cake" == "cake2")还是不平等("walk >= rab"),data.table将在被联接的两个数据集的上下文中对这些联接进行内部判断.因为它们都是字符串,所以它们都可以通过编程方式形成.

然而,重要的是,symbolsstrings不能同时使用,您必须使用其中的任何一个.(我想不出为什么使用字符串是不优化的,因为如果您写walk >= rab,只需要多两个字符就可以写"walk >= rab".)

R相关问答推荐

更改网格的crs以匹配简单要素点对象的crs

根据固定值范围在tible中添加新行

创建重复删除的唯一数据集组合列表

过滤矩阵以获得R中的唯一组合

从多个前置日期中获取最长日期

使用spatVector裁剪网格数据时出现的问题

行式dppr中的变量列名

如何编辑ggplot的图例字使用自定义对象(gtable)?'

R for循环返回到先前值

是否可以创建一个ggplot与整洁判断的交互作用

使用R中的正则表达式将一列分割为多列

如何基于两个条件从一列中提取行

如何对r中包含特定(未知)文本的行求和?

观察器中的inaliateLater的位置

将工作目录子文件夹中的文件批量重命名为顺序

如何计算每12行的平均数?

如何显示准确的p值而不是<;0.001*?

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

在REST API中使用参数R