【发布时间】:2017-06-25 07:43:06
【问题描述】:
我有一个巨大的数据框,其中包含匹配的案例控制主题。匹配的 case:control 是 1:3。我正在尝试重新采样案例 ID,然后提取相应的控件。
所以,我有一个 id 向量,其中的 id 可以重复。我想为向量的每个 id 提取案例和控件的数据。案例和匹配控件具有相同的 case_num。 %in% 始终从数据中获取唯一 ID。我已经使用 llply 来做到这一点。大约需要 2.5 秒。有没有其他有效的方法?
我包括一个简单的例子和我对这个问题的解决方案。
在我的例子中,id 向量在 1921 年的长度,该函数必须提取控件 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
【问题讨论】:
-
请将数据作为文本而不是图像发布。使用
dput(your_data)并复制粘贴结果。 -
做了修改,拿到cmets后也加了代码。
-
最好不要混合 plyr + dplyr + data.table;最好只选择 1。Plyr 基本上已被 dplyr 取代,所以可能不是那个。
-
谢谢,但 llply 花费的时间最长。我也试过lapply,时差不大。
标签: r dataframe statistics subset plyr