【发布时间】:2016-03-09 09:45:50
【问题描述】:
问题
我有四个人的两个测量数据,每个数据都是宽格式的。措施是x 和y,个人是A, B, C, D。数据框是这样的
d <- data.frame(matrix(sample(1:100, 40, replace = F), ncol = 8))
colnames(d) <- paste(rep(c("x.", "y."),each = 4), rep(LETTERS[1:4], 2), sep ="")
d
x.A x.B x.C x.D y.A y.B y.C y.D
1 56 65 42 96 100 76 39 26
2 19 93 94 75 63 78 5 44
3 22 57 15 62 2 29 89 79
4 49 13 95 97 85 81 60 37
5 45 38 24 91 23 82 83 72
现在,我想为每一行获取y 的值,对于具有最低值x 的个人。
因此,在上面的示例中,1 行中x 的最小值是针对单个C。因此,对于行1,我想获得y.C,即39。
在示例中,结果向量应为39, 63, 89, 81, 83。
接近
我试图通过首先为x 的值生成d 子集的矩阵来解决此问题。
t(apply(d[,1:4], 1, function(x) min(x) == x))
x.A x.B x.C x.D
[1,] FALSE FALSE TRUE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE FALSE TRUE FALSE
[4,] FALSE TRUE FALSE FALSE
[5,] FALSE FALSE TRUE FALSE
现在我想将此矩阵应用于数据框子集的子集,以获取 y 的值。但我找不到实现这一目标的方法。
非常感谢任何帮助。也非常欢迎提出完全不同的、更优雅的方法的建议。
非常感谢!
【问题讨论】:
-
您可以使用布尔掩码直接对
y值集进行子集化:d[,5:8][t(apply(d[,1:4], 1, function(x) min(x) == x))] -
您可以查看以下解决方案。与您帖子中的
apply方法相比,它应该更快 -
@alistaire 该方法不会以正确的顺序给出预期的输出。我会使用
t(d[,5:8])[apply(d[,1:4], 1, function(x) min(x) == x)]
标签: r matrix dataframe subset logical-operators