【问题标题】:How to subset the same rows/ids repeatedly in r如何在 r 中重复子集相同的行/ID
【发布时间】: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


【解决方案1】:

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

split_data = split(test_data, test_data$id)

我的猜测是你可以在这里停下来处理这个列表,其中每个 id 分别包含,但只有一次。但是,如果您确实需要 id_vec 中每次重复的数据副本,只需使用列表索引:

result = split_data[id_vec]

如果最后你要重新组合成一个数据框,这是非常浪费的。它涉及复制整个数据,而真正需要的是行号。如果我理解正确,您的示例很差,因为案例编号在数据中重复,而您的示例数据具有唯一的ids。这是一种方法,在数据和id_vec 中重复ids 以重新采样数据而不复制数据框:

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

【讨论】:

  • 这工作得很好。你是对的,我的例子并不完美。我会编辑它。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-01-26
  • 2022-08-21
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多