2017-02-07 38 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

这工作得很好。你说的对,我的例子并不完美。我会编辑它。非常感谢你。 –