2017-08-30 27 views
1

我有两个数据框,并且正在尝试使用另一个矢量作为索引创建一个由来自数据框的列的选择组成的矢量。使用另一个作为索引以创建新矢量以从数据框中选择数据

这里有两个数据帧作为说明性示例:

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) 

谢谢!

回答

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

类似于第二种方法:'data [-1] [cbind(match(index $ PIN,data $ PIN),match(index $ TS,names(data)[ - 1]))]''。不确定在效率方面哪个更好,但是这个避免了as.numeric'调用。 – lmo

+1

This Works,thank you! – Jklein

0

我们可以用量化的选项使用row/column索引中提取的元素。设置行名称与所述第一列“数据”,而子集划分以除去所述第一列(data[-1]),并使用“索引”的数据集,以提取与行/列名的元素

`row.names<-`(data[-1], data[,1])[as.matrix(index)] 
#[1] 1 17 23 4 10 

或者另一种选择是tidyverse

library(tidyverse) 
data %>% 
    gather(key="TS", value, -PIN) %>% 
    right_join(., index) %>% 
    .$value 
#[1] 1 17 23 4 10 
0

不优雅,但工程:

diag(as.matrix(data[as.character(index$TS)])) 
# [1] 1 17 23 4 10 
相关问题