这个问题与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
这给出了所需的输出,但是看起来很简单而且也很慢。有一个更好的方法吗?
答案 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))