我有两个数据框,我正在尝试使用另一个向量作为索引来创建一个由数据框列中的选区组成的向量。
以下是两个数据框作为说明性示例:
PIN <- c("case1", "case2", "case3", "case4", "case5")
TS <- c("TS1", "TS4", "TS5", "TS1", "TS2")
index <- data.frame(PIN, TS)
PIN <- c("case1", "case2", "case3", "case4", "case5")
TS1 <- c(1, 2, 3, 4, 5)
TS2 <- c(6, 7, 8, 9, 10)
TS3 <- c(11, 12, 13, 14, 15)
TS4 <- c(16, 17, 18, 19, 20)
TS5 <- c(21, 22, 23, 24, 25)
data <- data.frame(PIN, TS1, TS2, TS3, TS4, TS5)
我想要创建的矢量是:
c(1, 17, 23, 4, 10)
谢谢!
答案 0 :(得分:3)
sapply(1:NROW(index), function(i) data[i, as.character(index$TS[i])])
#[1] 1 17 23 4 10
OR
as.numeric(data[cbind(1:NROW(index), match(as.character(index$TS), names(data)))])
#[1] 1 17 23 4 10
答案 1 :(得分:0)
我们可以使用矢量化选项使用data[-1]
索引来提取元素。设置&#39;数据&#39;的行名称。使用第一列对其进行子集化以删除第一列(`row.names<-`(data[-1], data[,1])[as.matrix(index)]
#[1] 1 17 23 4 10
)并使用&#39;索引&#39;数据集以提取具有行/列名称的元素
tidyverse
或另一个选项是library(tidyverse)
data %>%
gather(key="TS", value, -PIN) %>%
right_join(., index) %>%
.$value
#[1] 1 17 23 4 10
{{1}}
答案 2 :(得分:0)
不那么优雅,但有效:
diag(as.matrix(data[as.character(index$TS)]))
# [1] 1 17 23 4 10