我想选择以下数据框的特定值:
src:
c1 c2 c3 c4 c5 c6
rA 9 12 44 88 11 1
rB 12 7 14 24 48 67
rC 0 15 97 17 13 18
rD 74 51 10 11 14 8
通过存储在数据框中的索引使用相同的列名和行名作为值:
idx:
c1 c4 c6
1 rA rD rA
2 rD rA rB
3 rB rC rC
所以结果应该是这样的:
res:
1 2 3
1 9 11 1
2 74 88 67
3 12 17 18
请问最优雅的方式是什么?
答案 0 :(得分:3)
鉴于原始帧的定义如下:
src <- data.frame(matrix(c(9, 12, 44, 88, 11, 1,
12, 7, 14, 24, 48, 67,
0, 15, 97, 17, 13, 18,
74, 51, 10, 11, 14, 8), nrow = 4, byrow = TRUE))
rownames(src) <- paste0("r", LETTERS[1:4])
colnames(src) <- paste0("c", 1:6)
idx <- data.frame(matrix(c("rA", "rD", "rB",
"rD", "rA", "rC",
"rA", "rB", "rC"), nrow = 3),
stringsAsFactors = FALSE)
colnames(idx) <- c("c1", "c4", "c6")
可以用sapply
来解决:
sapply(colnames(idx), function(col) {
src[idx[, col], col]
})
它产生具有预期结果的矩阵:
c1 c4 c6
[1,] 9 11 1
[2,] 74 88 67
[3,] 12 17 18
答案 1 :(得分:0)
这是使用match
的一种方法:
result <- idx
result[] <- src[cbind(match(unlist(idx), rownames(src)),
match(names(idx)[col(idx)], names(src)))]
result
# c1 c4 c6
#1 9 11 1
#2 74 88 67
#3 12 17 18
这里的逻辑是创建一个包含两列的矩阵,第一列具有行号,第二列具有列号,以从中提取数据。