【发布时间】:2020-06-15 18:20:28
【问题描述】:
我有一个数据集,其中包含一个 ID 变量和数千列平均值。下面是一个可重现的示例。对于每个 ID,我想选择包含最接近 0.50 的值的列名。如果有平局,请选择最低值。有没有一种有效的方法来做到这一点(最好使用 dplyr 或 data.table)?
df = data.frame(ID = paste("ID", 1:1000, sep = ""),
matrix(rnorm(20000), nrow=10))
> df[1:5, 1:5]
ID X1 X2 X3 X4
1 ID1 -0.5532944 -1.20671805 0.75142048 0.56022595
2 ID2 -1.0083010 -0.01534611 1.53546691 -0.08762588
3 ID3 -0.1606776 -0.96947669 -0.38631278 -1.15647134
4 ID4 -0.5957471 -0.20918120 -0.05246698 -0.84235789
5 ID5 0.1569595 -0.62460245 -0.39454014 0.91089249
我的目标是拥有一个包含 ID 变量和列名的数据框,其中包含最接近 0.5 的值以及该值。
ID T P
1 ID1 X10 0.5671
2 ID2 X100 0.4999
3 ID3 X34 0.5877
4 ID4 X21 0.5055
5 ID5 X15 0.4987
【问题讨论】:
-
相关:For each row return the column name of the largest value。首先抓取与 0.5 偏差最小的列,
ci = max.col(-abs(d[ , -1] - 0.5))。然后data.frame(id = d[ , 1], nm = names(d[ , -1])[ci], val = d[ , -1][cbind(seq_len(nrow(d)), ci)]) -
请使用
set.seed(<fixed_value>)使随机数可重现。谢谢。
标签: r dplyr data.table