Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在r中重复子集相同的行/ID_R_Dataframe_Statistics_Subset_Plyr - Fatal编程技术网

如何在r中重复子集相同的行/ID

如何在r中重复子集相同的行/ID,r,dataframe,statistics,subset,plyr,R,Dataframe,Statistics,Subset,Plyr,我有一个巨大的数据框,里面有匹配的病例对照对象。匹配的案例:对照是1:3。我正在尝试对案例ID重新采样,然后提取相应的控件 所以,我有一个ID向量,在这里可以重复ID。我想为向量的每个id提取案例和控件的数据。大小写和匹配控件具有相同的大小写。\u num。%in%始终从数据中获取唯一ID。我过去常做这件事。大约需要2.5秒。还有其他有效的方法吗 我包括一个简单的例子和我对这个问题的解决方案 在我的例子中,1921年id向量的长度,函数必须提取1921次控件。因此,如果时间可以减少一秒钟,实际上

我有一个巨大的数据框,里面有匹配的病例对照对象。匹配的案例:对照是1:3。我正在尝试对案例ID重新采样,然后提取相应的控件

所以,我有一个ID向量,在这里可以重复ID。我想为向量的每个id提取案例和控件的数据。大小写和匹配控件具有相同的大小写。\u num。%in%始终从数据中获取唯一ID。我过去常做这件事。大约需要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

首先将数据帧拆分为每个id的数据帧列表:

split_data = split(test_data, test_data$id)
我的猜测是,您可以停在这里,使用每个
id
单独的列表,但只能使用一次。但是,如果您确实需要
id\u vec
中每次重复的数据副本,只需使用列表索引:

result = split_data[id_vec]

如果最后要重新组合到单个数据帧中,这是非常浪费的。它涉及到复制整个数据,而真正需要的只是行号。如果我理解正确,您的示例很差,因为案例编号在数据中重复,而您的示例数据具有唯一的
id
s。以下是一种在数据和
id\u vec
中重复使用
id
s的方法,可以在不复制数据帧的情况下重新采样数据:

## 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

请将数据以文本形式发布,而不是图像形式发布。使用
dput(您的_数据)
并复制粘贴结果。进行编辑,并在获得注释后添加代码。可能最安全的方法是不要混合使用plyr+dplyr+data.table;最好只选一个。Plyr基本上已经被dplyr取代,所以可能不是那个。谢谢,但是llply花费的时间最长。我也试过lapply,时差很小,效果很好。你是对的,我的例子并不完美。我会编辑它。非常感谢你。