2017-02-07 41 views
0

我有一個巨大的數據框與匹配的病例控制科目。匹配的情況:控制是1:3。我正在嘗試重新抽取案例id,然後提取相應的控件。如何重複子集相同的行/ ID

所以,我有一個ids可以重複的向量。我想爲矢量的每個id提取案例和控件的數據。案例和匹配控件具有相同的case_num。 %中的%始終從數據中獲取唯一的ID。我用llply來做到這一點。大約需要2.5秒。有沒有其他有效的方法?

我包括一個簡單的例子和​​我對問題的解決方案。

在我的情況下,在1921年的ID矢量的長度,功能必須提取控件1921次。所以如果時間可以縮短一秒鐘,實際上我會重複整個過程1000次。謝謝!

test_data=  

data.frame(id=c(1,1,2,4,4,5,6),value=c('g','e','r','j','a','b','c')) 

test_data 
id value 
1 1  g 
2 1  e 
3 2  r 
4 4  j 
5 4  a 
6 5  b 
7 6  c 



id_vec= c(1,4,1,5) 

library(plyr) 
newdata.list=llply(id_vec, function(x) test_data[test_data$id==x,]) 

## or if we make our data a data.table then 
library(data.table) 
test_data= data.table(test_data) 

newdata.list=llply(id_vec, function(x) test_data[id==x]) 

library(dplyr) 
newdata.frame= bind_rows(newdata.list) ### making it a dataframe 
newdata.frame 
    id value 
1: 1  g 
2: 1  e 
3: 4  j 
4: 4  a 
5: 1  g 
6: 1  e 
7: 5  b 
+0

PLS發佈的數據爲文本,而不是圖像。使用'dput(your_data)'並複製粘貼結果。 – GGamba

+0

做了編輯,並在收到評論後添加了代碼。 –

+0

可能最安全的是不混用plyr + dplyr + data.table;最好選擇1.Plyr已經基本上被dplyr所取代,所以可能不是那個。 – Frank

回答

0

首先拆分數據幀分成dataframes列表每個ID:

split_data = split(test_data, test_data$id) 

我的猜測是,你可以停在這裏與此列表中分別有各自id工作,但只有一次。但是,如果你真的需要的數據的副本每次重複在id_vec,只需使用列表索引:

result = split_data[id_vec] 

這是很浪費的,如果在你到底是重組到一個單一的數據幀。它涉及複製整個數據,當所有真正需要的是行號。如果我理解正確,您的示例很差,因爲案例編號在數據中重複,而您的示例數據具有唯一的id s。這裏是一個辦法,反覆id S IN的數據和id_vec雙方未做數據幀拷貝到重採樣數據:

## new example data 
test_data2 = data.frame(id=c(1, 1, 2, 3, 3, 4), value=c('g','e','r','j','a','b')) 
id_vec2 = c(3, 1, 2, 3, 4, 1) 

rows = lapply(id_vec2, FUN = function(x) which(test_data2$id == x))  
result = test_data2[unlist(rows), ] 
result 
#  id value 
# 4 3  j 
# 5 3  a 
# 1 1  g 
# 2 1  e 
# 3 2  r 
# 4.1 3  j 
# 5.1 3  a 
# 6 4  b 
# 1.1 1  g 
# 2.1 1  e 
+0

這工作得很好。你說的對,我的例子並不完美。我會編輯它。非常感謝你。 –