【发布时间】:2021-06-30 12:42:56
【问题描述】:
考虑以下 dt:
dt <- data.table(id=c(rep(1,11),rep(2,10)),col1=c(100:80),col2=c(95:75),col3=c(2,100:81))
changeCols <- c("col1","col2","col3")
newCols <- paste0(changeCols, "_diff")
dt[, (newCols) := .SD - shift(.SD), by=id, .SDcols=changeCols][]
现在,我需要在几列中检测第二个位置的“跳跃”(在这种情况下删除第一个位置),就像 col3_diff 中的情况一样,我尝试这样做通过:
dt[, if (.SD[2]>0) .SD[-1] else .SD, by=id, .SDcols=newCols]
我只得到了 data.table 的子集,即我丢失了 col1、col2、col3,但我需要完整的 dt。
知道怎么做吗?
提前非常感谢!
【问题讨论】:
-
不是很清楚。您是否尝试使用
(.SD[2]>0)到detect "jumps" on the second position?首先,您需要检查dt[, .SD[2] , by=id, .SDcols=newCols]的输出。只获取子集没有问题,因为by=id, .SDcols=newCols已经确定了输出列。 -
感谢您的回复,我需要的是一个包含来自 dt 的所有功能的 data.table。当我们检查
dt[, .SD[2] , by=id, .SDcols=newCols]时,我们看到 col3_diff 大于 0,因此适用 if 情况,并且需要删除该行,而 dt 中的所有列都应该保留。 -
在继续之前,您需要解决您的代码生成警告的事实:
the condition has length > 1 and only the first element will be used。出现警告是有原因的,在这种情况下,它会告诉您您使用if不当(可能是any或all?)。 -
对,我本来想有的。
标签: r data.table