library(data.table)
a <- data.table(p = seq(1, 5, 0.5), s = 1:9)
b <- data.table(p = c(2.0, 6, 3.5), s = c(4, 7, 0))
我有 2 个数据框,数据框“a”是基础,数据框“b”包含更新。我需要使用以下条件对数据框“a”进行更改:
结果:
p s
1: 1.0 1
2: 1.5 2
3: 2.0 4
4: 2.5 4
5: 3.0 5
6: 4.0 7
7: 4.5 8
8: 5.0 9
9: 6.0 7
答案 0 :(得分:4)
使用 dplyr
(问题未指定是否需要 data.table
语法)。
p
的值。distinct()
确保所有行都是唯一的。library(dplyr)
to_delete <-
filter(b, s == 0) %>%
pull(p)
bind_rows(a, b) %>%
filter(!p %in% to_delete) %>%
distinct(p, .keep_all = TRUE)
#> p s
#> 1: 1.0 1
#> 2: 1.5 2
#> 3: 2.0 3
#> 4: 2.5 4
#> 5: 3.0 5
#> 6: 4.0 7
#> 7: 4.5 8
#> 8: 5.0 9
#> 9: 6.0 7
答案 1 :(得分:3)
也许一个连接 on
'p'(假设它们具有相同的值精度)用来自 'b' (i.s
) 的相应 's' 更新 's',删除's' 为 0 的行和 rbind
'p' 值不在 a 的 p 中的 'b' 行
rbind(a[b, s := i.s, on = .(p)][s != 0], b[!p %in% a$p])
-输出
# p s
#1: 1.0 1
#2: 1.5 2
#3: 2.0 4
#4: 2.5 4
#5: 3.0 5
#6: 4.0 7
#7: 4.5 8
#8: 5.0 9
#9: 6.0 7
答案 2 :(得分:3)
我首先使用 full_join 以便我们拥有两个数据帧的所有行。如果 s.x 和 s.y 不相等并且 s.y 不是 NA 值,它会替换 s.x 甚至在后来删除的零的情况下。如果 s.x 是 NA 而 s.y 不是,这意味着来自数据帧 b 的 s.y 的行 ID 在数据 a 中不存在,它再次替换它。
library(dplyr)
library(tidyr)
library(stringr)
a %>%
full_join(b, by = "p") %>%
mutate(s.x = ifelse(s.x != s.y & !is.na(s.y), s.y, s.x),
s.x = ifelse(is.na(s.x) & !is.na(s.y), s.y, s.x)) %>%
select(-s.y) %>%
filter(s.x != 0) %>%
rename_with(~ str_remove(., ".x"), ends_with(".x"))
p s
1: 1.0 1
2: 1.5 2
3: 2.0 4
4: 2.5 4
5: 3.0 5
6: 4.0 7
7: 4.5 8
8: 5.0 9
9: 6.0 7
答案 3 :(得分:1)
使用 coalesce
会更容易
a %>%
full_join(b, by = "p") %>%
transmute(p, s = coalesce(s.y, s.x)) %>%
filter(s != 0)
p s
1: 1.0 1
2: 1.5 2
3: 2.0 4
4: 2.5 4
5: 3.0 5
6: 4.0 7
7: 4.5 8
8: 5.0 9
9: 6.0 7