首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速数据帧匹配

加速数据帧匹配
EN

Stack Overflow用户
提问于 2011-01-15 12:02:40
回答 4查看 744关注 0票数 7

我有两个数据帧,很像下面这样:

代码语言:javascript
复制
data = data.frame(data=cbind(1:12,rep(c(1,2),6),rep(c(1,2,3),4)))
colnames(data)=c('v','h','c')

lookup = data.frame(data=cbind(c(rep(1,3),rep(2,3)),rep(c(1,2,3),2),21:26))
colnames(lookup)=c('h','c','t')

我想从h和c列匹配的数据$v中减去lookup$t。

我想像这样的东西会有用的

代码语言:javascript
复制
data$v-lookup$t[lookup$h==data$h&lookup$c==data$c]

但是不知道我想隐式地迭代数据行

我最终做了这件事

代码语言:javascript
复制
myt = c()
for(i in 1:12) {
myt[i] = lookup$t[lookup$h==data$h[i]&lookup$c==data$c[i]]
}

这很好用,但我希望有人能提出一种更明智的方法,而不涉及循环。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-15 12:11:54

听起来你可以合并然后计算一下:

代码语言:javascript
复制
dataLookedUp <- merge(data, lookup)
dataLookedUp$newValue <- with(dataLookedUp, v - t )

对于真实数据,合并和计算是否更快?

如果数据和/或查找真的很大,那么可以在合并之前使用data.table创建索引,以加快速度。

票数 8
EN

Stack Overflow用户

发布于 2011-01-15 16:11:05

另一个选项是1。)对于那些习惯于SQL查询的人来说更加熟悉。)通常比标准合并更快的是使用sqldf包。(请注意,在Mac上,您可能希望安装Tcl/Tk,sqldf依赖于它。)作为额外的好处,sqldf在默认情况下会自动将字符串转换为因子。

代码语言:javascript
复制
install.packages("sqldf")
library(sqldf)
data <- data.frame(v = 1:12, h = rep(c("one", "two"), 6), c = rep(c("one", "two", "three"), 4))
lookup <- data.frame(h = c(rep("one", 3), rep("two", 3)), c = rep(c("one", "two", "three"), 2), t =  21:26)
soln <- sqldf("select * from data inner join lookup using (h, c)")
soln <- transform(soln, v.minus.t = v - t)
票数 6
EN

Stack Overflow用户

发布于 2011-01-15 13:10:59

对于整数列,我不认为您可以做任何事情来改进JD的提供,但是如果您在合并的列中有字符串,您可以使用as.factor创建因子,这可以根据您的数据集的大小和您预期的合并/排序次数来加速merge

代码语言:javascript
复制
data <- data.frame(v = 1:12, h = rep(c("one", "two"), 6), c = rep(c("one", "two", "three"), 4))
lookup <- data.frame(h = c(rep("one", 3), rep("two", 3)), c = rep(c("one", "two", "three"), 2), t =  21:26)
data <- transform(data, h = as.factor(h), c = as.factor(c))
lookup <- transform(lookup, h = as.factor(h), c = as.factor(c))
temp <- merge(data, lookup)
temp <- transform(temp, v.minus.t = v - t)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档