数据表R中计算后的条件

时间:2019-03-13 14:32:40

标签: r data.table

这个问题与R中data.table的有效使用有关。

假设以下数据表

DataTable <- data.table(Id = rep(1:10,5), Method = rep(c("M1","M2","M3","M4", "M5"), each = 10), Value = rnorm(100)) 

我想知道的是:对于哪个Id,M1和M3之间的值的最大绝对差大于2?

我考虑过以下代码:

DataTable[,if( max(abs(.SD[Method == "M1", Value] - .SD[Method == "M3", Value] )) > 2) 1, by = "Id"]$Id

这给出了所需的输出,但是看起来很简单而且也很慢。有一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这里有2种可能的方法:

1)就像akrun对Value[Method=="M1"]的建议一样

DataTable[, Id[any(abs(Value[Method=="M1"] - Value[Method=="M3"]) > 2)], by=.(Id)]$V1

2)转换为宽格式(对于大型数据集,转换速度可能会变慢)

dcast(DataTable, Id ~ Method, sum, value.var="Value")[, Id[abs(M1 - M3) > 2]]

数据:

set.seed(0L)
DataTable <- data.table(Id = rep(1:10, 5), 
    Method = rep(c("M1","M2","M3","M4", "M5"), each = 10), 
    Value = rnorm(50))