当你在遍历列时,通常长格式更容易操作。因此,为了展示这种选项,在这种情况下使用它并不是最好的选择。
以下代码不是很快,因为它在.SD
上使用了[
。但无论如何,这里是逻辑,等我们开始优化.SD[...]
时可以使用。
> a
id x y z
1: 60 0.006884017 0.9159115 0.876148
2: 160 0.006884017 0.9159115 0.876148
3: 260 0.006884017 0.9159115 0.876148
4: 360 0.006884017 0.9159115 0.876148
5: 460 0.006884017 0.9159115 0.876148
---
996: 504 0.990417986 0.7167666 0.751991
997: 604 0.990417986 0.7167666 0.751991
998: 704 0.990417986 0.7167666 0.751991
999: 804 0.990417986 0.7167666 0.751991
1000: 904 0.990417986 0.7167666 0.751991
> require(reshape2)
> DT = as.data.table(melt(a, "id"))
> DT
id variable value
1: 60 x 0.006884017
2: 160 x 0.006884017
3: 260 x 0.006884017
4: 360 x 0.006884017
5: 460 x 0.006884017
---
2996: 504 z 0.751991033
2997: 604 z 0.751991033
2998: 704 z 0.751991033
2999: 804 z 0.751991033
3000: 904 z 0.751991033
现在数据已经处于长格式中(它是否一开始就是长格式呢?),接下来的步骤会更容易:
> DT[, below:=value<median(value), by=variable]
> DT
id variable value below
1: 60 x 0.006884017 TRUE
2: 160 x 0.006884017 TRUE
3: 260 x 0.006884017 TRUE
4: 360 x 0.006884017 TRUE
5: 460 x 0.006884017 TRUE
---
2996: 504 z 0.751991033 FALSE
2997: 604 z 0.751991033 FALSE
2998: 704 z 0.751991033 FALSE
2999: 804 z 0.751991033 FALSE
3000: 904 z 0.751991033 FALSE
> DT[below==TRUE, .SD[.N==3], by=id]
id variable value below
1: 88 x 0.01873885 TRUE
2: 88 y 0.05834677 TRUE
3: 88 z 0.08973225 TRUE
4: 188 x 0.01873885 TRUE
5: 188 y 0.05834677 TRUE
---
356: 848 y 0.39433186 TRUE
357: 848 z 0.14152092 TRUE
358: 948 x 0.48932049 TRUE
359: 948 y 0.39433186 TRUE
360: 948 z 0.14152092 TRUE
然后,如果需要宽度,请将其转换回来。 但是我尽量保持长的东西,就像数据库一样。
可能有更直接的方法来完成上述操作,也许还有一种避免速度问题的方法,可以避免使用.SD[...]。
附注:我考虑过setkey(a,x),然后只取前一半。这对于一个列是有效的。但是第二个需要y
median
被调用了 3 次,您可以在运行data.table
命令之前调用debug(median)
进行检查。 - edditrace
可以避免因debug
而停止。 - Kevin Ushey