【问题标题】:Fast way to subset from data.frame / data.table based on metadata table基于元数据表从 data.frame / data.table 子集的快速方法
【发布时间】:2014-02-14 11:47:22
【问题描述】:

我想根据我的元数据中的两个条件制作我的数据子集。

data= data.frame (w=c(rep ("a", 10),rep("b", 10), rep ("c", 10)), y=(rep(c(1,2,3),10)), v=rnorm (30))
metadata = data.frame (w=c("b","a",),y= c(1,2))

allY <- data.frame ()
mainY <- data.frame ()

for (x in 1:length (data [,1])){
allY <- data.frame (data [which (data$w %in% metadata[x,1]),])
mainY <- data.frame (rbind (mainY, allY [which (allY$y %in% metadata[x,2]),]))
}
mainY

问题在于数据和元数据都非常大,而且需要花费数小时才能完成。当它完成时,我遇到了一个错误:

你知道我怎样才能启动这个过程,也许使用 data.table 代替吗?

非常感谢!

【问题讨论】:

  • 您发布的代码没有做任何事情(mainY 最后是空的),因此很难弄清楚您在做什么。选择metadata[x,2] 几乎肯定不会满足您的要求:x 正在从一个因子转换为一个数字。如果这不是一个因素,那么它将使用行名,而你没有。
  • 请描述您想要达到的目标并显示预期的输出。
  • 谢谢。我使用了 metadata[,1] 而不是 metadata [x,1] 并排除了 for 循环,我的问题现在解决了。做起来真的很快。

标签: r dataframe data.table binary-search


【解决方案1】:

很难说...但我怀疑你想要的可以简单地完成:

merge(data,metadata)

这在 R 中并不是很快,但比 for 循环要好。如果你事先转换成data.table,并设置好key,你就可以像这样运行merge,它会很快工作。

【讨论】:

  • 我已经更改了代码,我想现在你可以明白我的意思了......我认为合并不会解决我的问题,因为我想要一个完全像 datadatametadata 中的信息完全不同。非常感谢
猜你喜欢
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2012-12-08
  • 2014-07-23
  • 2011-09-29
  • 2014-01-04
相关资源
最近更新 更多