R 基于“0”以编程方式调用对象;名称“;存储在变量中
我有一个关于通过从变量中检索对象名称来引用对象的问题 设置 这将创建my baseline data.table,所有标志列都已就位,并在处理之前设置为FALSE 处理过程是获取属性字符串,解析出各个属性,并相应地设置标志。这就是我正在做的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",
# 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)]