数据帧由索引的数据帧子集

时间:2020-10-20 07:17:52

标签: r dataframe subset

我想选择以下数据框的特定值:

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

请问最优雅的方式是什么?

2 个答案:

答案 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

这里的逻辑是创建一个包含两列的矩阵,第一列具有行号,第二列具有列号,以从中提取数据。