猿问

当变量名存储在字符向量中时,选择/赋值到data.table

当变量名存储在字符向量中时,选择/赋值到data.table

如何引用data.table如果变量名存储在字符向量中?例如,这适用于data.frame:

df <- data.frame(col1 = 1:3)colname <- "col1"df[colname] <- 4:6df#   col1# 1    4# 2    5# 3    6


如何对data.table执行相同的操作?:=符号?最明显的是dt[ , list(colname)]不起作用(我也没料到)。


猛跑小猪
浏览 568回答 3
3回答

万千封印

两种编程方式选择变量:with = FALSE:DT&nbsp;=&nbsp;data.table(col1&nbsp;=&nbsp;1:3)colname&nbsp;=&nbsp;"col1"DT[,&nbsp;colname,&nbsp;with&nbsp;=&nbsp;FALSE]&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;1#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;3:&nbsp;&nbsp;&nbsp;&nbsp;3“点”(..)前缀:DT[,&nbsp;..colname]&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;1#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;3:&nbsp;&nbsp;&nbsp;&nbsp;3关于“点”的进一步描述(..)符号,见1.10.2中的新特点(目前没有在帮助文本中描述)。到指派若要变量,请将:=括号内:DT[,&nbsp;(colname)&nbsp;:=&nbsp;4:6]&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;4#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;5#&nbsp;3:&nbsp;&nbsp;&nbsp;&nbsp;6后者称为列。普朗克,因为您将整个列向量替换为引用。如果子集i在这里,它将以参考的方式签署。亲生(colname)是在2014年10月cran版1.9.4版中引入的速记。这是新闻项目:使用with = FALSE带着:=现在所有情况下都不推荐使用,因为将lhs包装在:=使用括号已经有一段时间了。colVar&nbsp;=&nbsp;"col1"DT[,&nbsp;colVar&nbsp;:=&nbsp;1,&nbsp;with&nbsp;=&nbsp;FALSE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;deprecated,&nbsp;still&nbsp;works&nbsp;silentlyDT[,&nbsp;(colVar)&nbsp;:=&nbsp;1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;please&nbsp;change&nbsp;to&nbsp;thisDT[,&nbsp;c("col1",&nbsp;"col2")&nbsp;:=&nbsp;1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;no&nbsp;changeDT[,&nbsp;2:4&nbsp;:=&nbsp;1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;no&nbsp;changeDT[,&nbsp;c("col1","col2")&nbsp;:=&nbsp;list(sum(a),&nbsp;mean(b)]&nbsp;&nbsp;#&nbsp;no&nbsp;changeDT[,&nbsp;`:=`(...),&nbsp;by&nbsp;=&nbsp;...]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;no&nbsp;change另见细节分节?`:=`:DT[i,&nbsp;(colnamevector)&nbsp;:=&nbsp;value]#&nbsp;[...]&nbsp;The&nbsp;parens&nbsp;are&nbsp;enough&nbsp;to&nbsp;stop&nbsp;the&nbsp;LHS&nbsp;being&nbsp;a&nbsp;symbol为了在评论中回答更多的问题,这里有一个方法(和往常一样,有很多种方法):DT[,&nbsp;colname&nbsp;:=&nbsp;cumsum(get(colname)),&nbsp;with&nbsp;=&nbsp;FALSE]#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;4#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;9#&nbsp;3:&nbsp;&nbsp;&nbsp;15或者,您可能会发现更容易读、写和调试eval&nbsp;a&nbsp;paste,类似于构造要发送到服务器的动态SQL语句:expr&nbsp;=&nbsp;paste0("DT[,",colname,":=cumsum(",colname,")]")expr#&nbsp;[1]&nbsp;"DT[,col1:=cumsum(col1)]"eval(parse(text=expr))#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;4#&nbsp;2:&nbsp;&nbsp;&nbsp;13#&nbsp;3:&nbsp;&nbsp;&nbsp;28如果经常这样做,就可以定义一个助手函数。EVAL&nbsp;:EVAL&nbsp;=&nbsp;function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))EVAL("DT[,",colname,":=cumsum(",colname,")]")#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;4#&nbsp;2:&nbsp;&nbsp;&nbsp;17#&nbsp;3:&nbsp;&nbsp;&nbsp;45现在data.table1.8.2自动优化j为了提高效率,最好使用eval方法。这个get()在……里面j防止某些优化,例如。或者,有set()..低开销,功能形式:=在这里会很好。看见?set.set(DT,&nbsp;j&nbsp;=&nbsp;colname,&nbsp;value&nbsp;=&nbsp;cumsum(DT[[colname]]))DT#&nbsp;&nbsp;&nbsp;&nbsp;col1#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;4#&nbsp;2:&nbsp;&nbsp;&nbsp;21#&nbsp;3:&nbsp;&nbsp;&nbsp;66

长风秋雁

对于多列和应用于列值的函数。在更新函数的值时,rhs必须是一个列表对象,因此使用.SD带着lapply会成功的。下面的示例将整数列转换为数字列。a1&nbsp;<-&nbsp;data.table(a=1:5,&nbsp;b=6:10,&nbsp;c1=letters[1:5])sapply(a1,&nbsp;class)&nbsp;&nbsp;#&nbsp;show&nbsp;classes&nbsp;of&nbsp;columns#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1&nbsp;#&nbsp;"integer"&nbsp;&nbsp;&nbsp;"integer"&nbsp;"character"&nbsp;#&nbsp;column&nbsp;name&nbsp;character&nbsp;vectornm&nbsp;<-&nbsp;c("a",&nbsp;"b")#&nbsp;Convert&nbsp;columns&nbsp;a&nbsp;and&nbsp;b&nbsp;to&nbsp;numeric&nbsp;typea1[,&nbsp;j&nbsp;=&nbsp;(nm)&nbsp;:=&nbsp;lapply(.SD,&nbsp;as.numeric&nbsp;),&nbsp;.SDcols&nbsp;=&nbsp;nm&nbsp;]sapply(a1,&nbsp;class)#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1&nbsp;#&nbsp;"numeric"&nbsp;&nbsp;&nbsp;"numeric"&nbsp;"character"
随时随地看视频慕课网APP
我要回答