【问题标题】:r data.table - can we use shift() on newly created columns [duplicate]r data.table - 我们可以在新创建的列上使用 shift() [重复]
【发布时间】:2021-09-07 15:13:50
【问题描述】:

是否可以在新创建的列上使用 shift ?在 for 循环编程中,我们可以从前一行访问新列的值。例如如下......我在 shift 语句中得到一个错误,因为即使“c”应该已经计算出来,“c”也不存在。

x <- data.table(a=c(1,2,3), b=c(4,5,6))
x[,':='(c=a*b, d=shift(c,-1))]

【问题讨论】:

  • 你有不想做x[,c:=a*b][, d:=shift(c,-1)]的理由吗?
  • 我想有条件地处理 c 的值并用它来导出 d。所以换句话说,下面的解决方案允许保留中间值,然后用它来处理下一行。

标签: r data.table


【解决方案1】:

一种可能的解决方案是在{} 内计算cd

x <- data.table(a=c(1,2,3), b=c(4,5,6))

x[,c("c","d"):=({c=a*b; d=shift(c,-1); list(c,d)})][]

   a b  c  d
1: 1 4  4 10
2: 2 5 10 18
3: 3 6 18 NA

【讨论】:

  • 只有一个问题...我们不能做这样的事情对吗?我尝试并得到了错误。听起来不能在同一个表达式中对新创建的变量使用 shift 。 x[,c("c","d"):=({c=ifelse(abb,shift(c,-1)); d=shift(c ,-1); 列表(c,d)})][]
  • 回答您的问题:c 需要在使用之前创建,就像普通的R 语法一样。所以这行不通。同样,ab 没有定义,同样会报错。顺便说一句,我会避免使用 c 作为列名,因为它可能会干扰 c()function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2020-07-29
  • 2021-05-14
相关资源
最近更新 更多