基于单个条件有效地更新多个data.table列

时间:2017-03-14 13:08:07

标签: r data.table

以下是我需要的一个简单示例:

data <- data.table(x = c(10, -10, 20, -20, 100, -100),
                 y = c(10, -10, 120, -120, 100, -100),
                 z = c(10, -10, 100, -100, 30, -30))

data[x > 90 | x < -90, x:=0]
data[z > 90 | z < -90, z:=0]

这很好用,但我希望用更简单的版本替换最后两行,因为我的实际数据中有很多列(大约200个,其中我需要更新一下) 50)和很多行(大约200万,所以数据有点重)

如果这是重复的话,请道歉

3 个答案:

答案 0 :(得分:4)

使用var stagingPlan = this.GetProcessingStatusEntryById(processingId); var library = GetProcessingLibraryByXmlString(stagingPlan.StagingRefProcessingEngineLibrary.LibraryXml); 可能最简单,效率最高:

eval(parse(...))

但是,我可能会解散data.table:

cols <- c("x", "z")
for (col in cols) 
  eval(parse(text = sprintf("data[%s > 90 | %s < -90, %s := 0][]", col, col, col)))
#     x    y   z
#1:  10   10  10
#2: -10  -10 -10
#3:  20  120   0
#4: -20 -120   0
#5:   0  100  30
#6:   0 -100 -30

答案 1 :(得分:1)

我们可以使用set

中的data.table
for(j in names(data)[c(1,3)]){
  set(data, i = which(data[[j]]>90 |data[[j]] < -90), j = j, value = 0)
 }

data
#     x    y   z
#1:  10   10  10
#2: -10  -10 -10
#3:  20  120   0
#4: -20 -120   0
#5:   0  100  30
#6:   0 -100 -30

答案 2 :(得分:0)

您可以使用功能形式的参考更新进行更新:

数据[z> 90 | z <-90,':='(x = 0,z = 0)]

您可以查看更多信息:https://www.rdocumentation.org/packages/data.table/versions/1.12.8/topics/%3A%3D