根据R中的指定条件更新数据帧

时间:2021-04-15 18:37:13

标签: r dataframe

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”进行更改:

  1. 如果数据框“b”中的“s”列的值为0,则需要从数据框“a”中删除所有具有对应值“p”的行
  2. 如果在数据框“in”中,“s”列中的值与数据框“a”中对应的值“s”不同,则必须将其替换为数据框“b”中的值
  3. 如果数据框“b”具有唯一值“p”,则需要将此行添加到数据框“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

4 个答案:

答案 0 :(得分:4)

使用 dplyr(问题未指定是否需要 data.table 语法)。

  1. 获取需要删除的 p 的值。
  2. 过滤掉在 1. 中找到的值并使用 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
相关问题