gpt4 book ai didi

r - 在 R 中按行有条件地连接数据帧

转载 作者:行者123 更新时间:2023-12-04 11:46:57 25 4
gpt4 key购买 nike

我想有条件地合并具有以下格式的两个表:

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)

条件规则是:

  1. 如果两个 ID 都在“坏”列表中,则删除该行
  2. 如果两个 ID 都不在“坏”列表中,则删除该行
  3. 如果只有一个 ID 是错误的,则将错误的值添加到行中。

生成的表格如下所示:

  id1  id2 bad_id_val
2 S002 S001 a
3 S003 S002 a
5 S004 S001 b

我能够使用以下代码片段完成此操作:

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 更有效的按行条件连接?提前致谢。

最佳答案

使用 data.table 包,我会按如下方式处理它:

library(data.table)
ids <- setDT(ids)[xor(id1 %in% bad_ids$bad_id_key, id2 %in% bad_ids$bad_id_key)
][, bad_id_val := ifelse(id1 %in% bad_ids$bad_id_key,
as.character(bad_ids$bad_id_val[match(id1, bad_ids$bad_id_key)]),
as.character(bad_ids$bad_id_val[match(id2, bad_ids$bad_id_key)]))]

这给出了期望的结果:

> ids
id1 id2 bad_id_val
1: S002 S001 a
2: S003 S002 a
3: S004 S001 b

在@jeremycg 的更大数据集上进行测试,得出以下关于速度的结果:

Unit: milliseconds
expr min lq mean median uq max neval cld
jeremy 9.196898 9.386950 9.854132 9.603002 9.749256 16.764747 100 b
OP 974.933816 985.813821 996.770067 992.145890 1000.411484 1143.402837 100 c
jaap 3.572531 3.612401 3.779686 3.679115 3.790707 9.803782 100 a

关于r - 在 R 中按行有条件地连接数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com