【发布时间】:2015-12-18 19:43:47
【问题描述】:
我想有条件地合并以下格式的两个表格:
id1 <- c('S001', 'S002', 'S003', 'S004', 'S004')
id2 <- c('S001', 'S001', 'S002', 'S002', 'S001')
ids <- data.frame(id1, id2)
和
bad_id_key <- c('S002', 'S004')
bad_id_val <- c('a', 'b')
bad_ids <- data.frame(bad_id_key, bad_id_val)
条件规则是:
- 如果两个 ID 都在“坏”列表中,则删除该行
- 如果两个 ID 都不在“坏”列表中,则删除该行
- 如果只有一个 ID 是错误的,则将错误值添加到该行。
生成的表格如下所示:
id1 id2 bad_id_val
2 S002 S001 a
3 S003 S002 a
5 S004 S001 b
我能够使用以下代码 sn-p 完成此操作:
conditionalJoin <- function(row){
if(row$id1 %in% bad_id_key & row$id2 %in% bad_id_key){
# do nothing
}
else if(row$id1 %in% bad_id_key){
merge(x=row, y=bad_ids, by.x="id1", by.y="bad_id_key", all.x=TRUE)
}
else if(row$id2 %in% bad_id_key){
merge(x=row, y=bad_ids, by.x="id2", by.y="bad_id_key", all.x=TRUE)
}
}
out <- do.call("rbind", as.list(by(ids, 1:nrow(ids), conditionalJoin)))
但是,随着 ids 数据框大小的增长,这种方法的扩展性极差。我认为这是因为 rbind 功能。另外,if else 不是很优雅的 R 代码。
有谁知道 R 命令可以执行这种比 rbind 更有效的逐行条件连接?提前致谢。
【问题讨论】: