Problem
我有四个人的数据,每个人都有四种不同的格式 . 措施是 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
现在,对于具有最低值 x
的个体,我想为每一行获取 y
的值 .
因此,在上面的示例中,行 1
中 x
的最低值是针对个别 C
. 因此,对于行 1
我想获得 y.C
,这是 39
.
在该示例中,结果向量应为 39, 63, 89, 81, 83
.
Approach
我试图通过首先为 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
的值 . 但我无法找到实现这一目标的方法 .
任何帮助深表感谢 . 建议采用完全不同的 - 更优雅的方法也非常受欢迎 .
非常感谢!
3 回答
我们使用以'x'('dx')和'y'('dy')开头的列对数据集进行子集化 . 使用带有行索引的
max.col
,cbind
获取'dx'每行中最小值的列索引,并获取'dy'中的相应元素 .以上可以很容易地转换为函数
或者使用基于OP的
apply
方法数据
这是我的解决方案 . 核心思想是有一些函数
which.min, which.max
可以行应用于数据框:编辑:
警告:只有在个人处于相同的治疗顺序x时才有效 . 和y . 和所有在场的人 . 否则你可以在Akrun的解决方案中使用grep .
我们可以创建如下函数,