2017-08-30 42 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 
相關問題