在R中使用data.table查找和替换值?

3
阅读了与R方法的基准测试和速度比较相关的内容后,我正在转向使用快速的data.table软件包来操作大型数据集。
我在完成一个特定任务时遇到了麻烦:
对于某个观测变量,我想要检查每个站点是否存在绝对滞后差(滞后1)大于一定阈值。如果是,则将其替换为NA,否则不做任何操作。
我可以使用set命令来处理整个数据表,但我需要按站点分开处理。
例如:
# Example data. Assume the columns are ordered by date.
set.seed(1)
DT <- data.table(station=sample.int(n=3, size=1e6, replace=TRUE), 
                 wind=rgamma(n=1e6, shape=1.5, rate=1/10),
                 other=rnorm(n=1.6),
                 key="station")

# My attempt
max_rate <- 35
set(DT, i=which(c(NA, abs(diff(DT[['wind']]))) > max_rate), 
    j=which(names(DT)=='wind'), value=NA)
# The results
summary(DT)

我的问题在于,我需要按站点对数据进行处理,但是我不想获得站点1最后一次读数和站点2第一次读数之间的滞后差异。
我尝试在方括号内使用“by = station”运算符,但我不确定如何操作。
1个回答

5

一种方法是使用特殊变量.I获取需要替换的行号,然后使用:=操作符(或set)通过引用将NA分配给这些行。

# get the row numbers
idx = DT[, .I[which(c(NA, diff(wind)) > 35)], by=station][, V1]
# then assign by reference
DT[idx, wind := NA_real_]

这个FR#2793由 @eddi 提出,如果被实现,将通过提供左侧对应索引的表达式和右侧替换值的方式更自然地完成此任务。简而言之,在将来我们应该能够这样做:

# in the future - a more natural way of doing the same operation shown above.
DT[, wind[which(c(NA, diff(wind)) > 35)] := NA_real_, by=station]

非常感谢。到目前为止,我非常喜欢data.table包,但是从plyr转换过来确实有一定的学习曲线。您知道在哪里可以找到data.table特殊变量(例如.I.SDNA_real_等)的文档吗? - ialm
另外,我也支持那个功能请求!那与我之前尝试/期望的相似,但遗憾地失败了。 - ialm
很高兴为您翻译。NA_real_是R语言中表示数值类型的缺失值NA的方式。其他特殊变量的文档可以在?data.table中找到。请确保仔细阅读example(data.table)(也在?data.table中),并逐个运行示例以理解其含义。 - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接