我在R中有一个数据框,其中包含一个包含唯一ID的列和10个如下所示的变量:
id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 555 2 1 10 3 8 9 5 7 4 6
2 681 10 5 4 8 7 3 6 2 9 1
3 2300 8 5 10 2 3 1 6 9 4 7
我想创建名为or1
到or10
的变量,它们捕获每行值1:10的列位置。
因此,例如,在第一行中,数字1显示在名为V2
的列中,因此or1 = 2
。如果我设法为上面的三行正确地执行此操作,我会得到以下内容:
id or1 or2 or3 or4 or5 or6 or7 or8 or9 or10
1 555 2 1 4 9 7 10 8 5 6 3
2 681 10 8 6 3 2 7 5 4 9 1
3 2300 6 4 5 9 2 7 10 1 8 3
我设法使用一组荒谬的if / then语句创建or1
,但我知道有一种更好的方法可能涉及索引。非常感谢所有帮助。
答案 0 :(得分:4)
这样做:
> ord <- data.frame(id = dat$id, t(apply(dat[, -1], 1, order)))
id X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 555 2 1 4 9 7 10 8 5 6 3
2 681 10 8 6 3 2 7 5 4 9 1
3 2300 6 4 5 9 2 7 10 1 8 3
(如果“id”不是第一列,我会将dat[, -1]
替换为更健壮的dat[!colnames(dat) %in% "id"]
)
然后,要使列名完全符合您的要求:
colnames(ord) <- sub("^X", "or", colnames(ord))