R 基于“0”以编程方式调用对象;名称“;存储在变量中

R 基于“0”以编程方式调用对象;名称“;存储在变量中,r,object,data.table,R,Object,Data.table,我有一个关于通过从变量中检索对象名称来引用对象的问题 设置 这将创建my baseline data.table,所有标志列都已就位,并在处理之前设置为FALSE 处理过程是获取属性字符串,解析出各个属性,并相应地设置标志。这就是我正在做的 # take the first object, parse the attributes into a data.table split.attributes <- str_split(DT[object == "one",

我有一个关于通过从变量中检索对象名称来引用对象的问题

设置

这将创建my baseline data.table,所有标志列都已就位,并在处理之前设置为FALSE

处理过程是获取属性字符串,解析出各个属性,并相应地设置标志。这就是我正在做的

# take the first object, parse the attributes into a data.table
split.attributes <- 
  str_split(DT[object == "one", attributes], ",", n = Inf) %>% 
  transpose() %>% 
  data.table() 
split.attributes
       .
1: green
2:  blue
3:   red

# format the attributes with initial Uppercase, and update the data.table
# ignore the extraneous string manipulates (like "\\s") in the real world example 
# the attributes are sometimes two word strings that are then a 
# single flag name, i.e., "blue green" -> "BlueGreen"
split.attributes <- split.attributes[,.] %>% 
  str_to_title() %>% 
  str_remove("\\s") %>% 
  as.list() %>% 
  data.table()
split.attributes

       .
1: Green
2:  Blue
3:   Red
现在,对于原始数据表中的第一个对象,我有了一组标志名(与实际列名相匹配),我希望为这些标志分配新的值(TRUE)。 我要做的是调用split.attributes[1]中的值,并将其用作DT中列的名称。我知道一种方法

eval(parse( text = (paste0("DT[1, ", eval(split.attributes[i]), " := TRUE]"))))
DT
   object       attributes isRed isGreen isBlue isOrange
1:    one green, blue, red FALSE    TRUE  FALSE    FALSE
2:    two              red FALSE   FALSE  FALSE    FALSE
3:  three     blue, orange FALSE   FALSE  FALSE    FALSE
我的一个标志现在为TRUE,所以我们知道object::one是“isGreen”::TRUE。当然,通过循环,我可以为所有对象设置所有必要的标志。我见过很多具体的解决方案,但它们都遵循以下基本思想:;将变量转换为字符串,将该字符串与构建表达式所需的其他字符串连接起来,然后将完整字符串作为表达式求值

问题:

有比“eval(解析(text=(paste0(“DT[1,”,eval(split.attributes[i]),“:=TRUE]”)更好的方法吗?
在我看来,这是一个常见的问题(或者我的个人项目在这方面是独一无二的),所以我觉得你应该能够做一些类似的事情
DT[1,”,获取变量值并将其作为函数的一部分添加到函数中(split.attributes[i],“:=TRUE]
这将创建您想要的基本体验,发送到R的是
DT[1,isGreen:=TRUE](作为待计算的表达式)
漂亮整洁,没有麻烦,没有分层功能


注意:我意识到我可以为此创建自己的函数,但我要问的是“是否有一个已经存在,而我只是还没有找到它?”。我只是想看看是否有人知道一些我不知道的事情,这会让我的生活更轻松。谢谢。

这里有一个选择:

DT[, attributes := strsplit(attributes, ", ")] # Convert to a list column
all_attr <- unique(unlist(DT$attributes))
DT[, 
   paste0("is_", all_attr) := lapply(all_attr, `%chin%`, attributes[[1]]), 
   by = object]

   object     attributes is_green is_blue is_red is_orange
1:    one green,blue,red     TRUE    TRUE   TRUE     FALSE
2:    two            red    FALSE   FALSE   TRUE     FALSE
3:  three    blue,orange    FALSE    TRUE  FALSE      TRUE
DT[, lapply(.SD, function(x) strsplit(x, ", ")[[1]]), by = object
   ][, x := TRUE
     ][, dcast(.SD, object ~ paste0("is_", attributes), value.var = "x", fill = FALSE)]

相关:。或者更容易以长格式保存数据:谢谢@Henrik。出于概念上的原因,我不希望列/行具有attribute=green等属性,我希望列为“isGreen”,因为它是更大应用程序的一部分(而实际数据不是“green”,而是更像“mutable”),因此在最后的演示中,我们希望用户要求“所有可变项”,因此使用一个标记为从概念上讲,“isMutable”比attribute==mutable更容易与应用程序的性质联系起来,如果这有意义的话。这也很有帮助,因为用户的逻辑要求不可变的项,所以查询“isMutable”==0。这是我的想法。谢谢@sindri_baldur。这很好,但这不是我想要的。让它工作不是问题,我更好奇的是,如果我忽略了直接方法,如“创建表达式,在表达式中包含变量值,指定值为对象名,计算”.这是一件奇怪的事,如果没有意义,很抱歉。我只是觉得很明显,所以我很难接受它不是那样工作的。
eval(parse( text = (paste0("DT[1, ", eval(split.attributes[i]), " := TRUE]"))))
DT
   object       attributes isRed isGreen isBlue isOrange
1:    one green, blue, red FALSE    TRUE  FALSE    FALSE
2:    two              red FALSE   FALSE  FALSE    FALSE
3:  three     blue, orange FALSE   FALSE  FALSE    FALSE
DT[, attributes := strsplit(attributes, ", ")] # Convert to a list column
all_attr <- unique(unlist(DT$attributes))
DT[, 
   paste0("is_", all_attr) := lapply(all_attr, `%chin%`, attributes[[1]]), 
   by = object]

   object     attributes is_green is_blue is_red is_orange
1:    one green,blue,red     TRUE    TRUE   TRUE     FALSE
2:    two            red    FALSE   FALSE   TRUE     FALSE
3:  three    blue,orange    FALSE    TRUE  FALSE      TRUE
DT[, lapply(.SD, function(x) strsplit(x, ", ")[[1]]), by = object
   ][, x := TRUE
     ][, dcast(.SD, object ~ paste0("is_", attributes), value.var = "x", fill = FALSE)]