【发布时间】:2013-03-24 04:42:37
【问题描述】:
我正在尝试根据多个标准上的两个 data.frames 的交集来填充二进制向量。
我的代码可以运行,但我觉得仅获取二进制向量就占用了过多的内存。
当我将代码应用于我的完整数据(40 毫米以上行)时。我开始有记忆问题。
有没有更简单的方法来生成向量?
这是一些样本数据(例如,子样本将只包括完整样本中的 obs):
ob1_1 <- as.data.frame(cbind(c(1999),c("111","222","666","777")),stringsAsFactors=FALSE)
ob2_1 <- as.data.frame(cbind(c(2000),c("111","333","555","777")),stringsAsFactors=FALSE)
ob3_1 <- as.data.frame(cbind(c(2001),c("111","222","333","777")),stringsAsFactors=FALSE)
ob4_1 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
full_sample <- rbind(ob1_1,ob2_1,ob3_1,ob4_1)
colnames(full_sample) <- c("yr","ID")
ob1_2 <- as.data.frame(cbind(c(1999),c("111","222","777")),stringsAsFactors=FALSE)
ob2_2 <- as.data.frame(cbind(c(2000),c("333")),stringsAsFactors=FALSE)
ob3_2 <- as.data.frame(cbind(c(2001),c("888")),stringsAsFactors=FALSE)
ob4_2 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
sub_sample <- rbind(ob1_2,ob2_2,ob3_2,ob4_2)
colnames(sub_sample) <- c("yr","ID")
这是我的工作代码:
q_intersect <- ""
q_intersect <- paste(q_intersect , "select a.yr, a.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from full_sample a ", sep=" ")
q_intersect <- paste(q_intersect , "intersect ", sep=" ")
q_intersect <- paste(q_intersect , "select b.yr, b.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from sub_sample b ", sep=" ")
q_intersect <- trim(gsub(" {2,}", " ", q_intersect ))
intersect_temp <- cbind(sqldf(q_intersect ),1)
colnames(intersect_temp ) <- c("yr","ID","in_both")
q_expand <- ""
q_expand <- paste(q_expand , "select in_both ", sep=" ")
q_expand <- paste(q_expand , "from full_sample a ", sep=" ")
q_expand <- paste(q_expand , "left join intersect_temp b ", sep=" ")
q_expand <- paste(q_expand , "on a.yr=b.yr ", sep=" ")
q_expand <- paste(q_expand , "and a.ID=b.ID ", sep=" ")
q_expand <- trim(gsub(" {2,}", " ", q_expand ))
solution <- as.integer(sqldf(q_expand)[,1])
solution [is.na(solution )] <- 0
提前感谢您的帮助!
【问题讨论】:
-
你应该用自然语言解释你想要什么。 (你说的代码正在工作只是锁定了我的 R 会话,可能是因为没有
trim函数?)不,第一个sqldf调用将其锁定。 -
@Dwin,我也遇到了同样的锁定问题。但仅在
q_intersect部分的前 4 行内。顺便说一句,布拉德,在您之前的问题中,您使用的是data.table,而这里您使用的是data.frame。这是故意的吗? -
@RicardoSaporta 嗨。刚刚未标记的 data.table。请参阅昨天在聊天室中纠正我的讨论。可能会进行更大的取消标记扫描。 SO 观点是标签是用于问题而不是答案。以全新的眼光,我现在看到并同意搜索“[data.table] data.table is:question”就是“[data.table]”单独的样子。但是,使用
data.table标记接受的答案似乎还可以(见聊天),其中投票数>10。要使用 data.table 搜索答案,我们可以使用“[r] -[data.table] data.table is:answer”。 -
@MatthewDowle,很高兴知道。感谢您指出这一点。