【问题标题】:Bind table only if specific value doesn't using r仅当特定值不使用 r 时才绑定表
【发布时间】:2021-05-03 08:20:44
【问题描述】:

是否可以仅在缺少特定值的情况下绑定行?

在此示例中,我有一个包含四个 ID 和一些值的表。假设每个 ID 都有一个对应的值 1-3。如您所见,表dat 中缺少其中一些值。为了解决这个问题,我想将datdat2 绑定,但仅限于表dat 中缺少列“值”的值。我怎样才能做到这一点?

说清楚,我总共只想要 12 行。例如,ID 4 的值为 3,而表 dat 中的 cat_var “green”。相比之下,在表 dat2 中,ID 4 的值为 3 并且 cat_var “red”。这意味着我不想绑定该行,因为表 dat 中已经存在 ID 4 和值 3 的行。我希望我能说清楚。

library(tidyverse)

数据:

id <- c(rep(1:4,3))
value <- c(rep(1:3, each = 4))
dat <- data.frame(id, value)
dat2 <- dat
dat <- dat %>%
  slice(1, 3, 5, 6, 7, 8, 10, 12)
dat2$cat_var <- c(rep("orange", 5), rep("green", 5), rep("red", 2))
dat$cat_var <- c(rep("orange", 3), rep("green", 5))

想要的结果:

# A tibble: 12 x 3
      id value cat_var
   <int> <int> <chr>  
 1     1     1 orange 
 2     2     1 orange 
 3     3     1 orange 
 4     4     1 orange 
 5     1     2 orange 
 6     2     2 green  
 7     3     2 green  
 8     4     2 green  
 9     1     3 green  
10     2     3 green  
11     3     3 red    
12     4     3 green  

【问题讨论】:

  • 我不太了解绑定行中的 12 个案例您想要的结果。看起来您将 4 3 red 替换为 4 3 green。但是,如果您真的想要绑定行(导致 13x3 表),那么简单的 dat2 %>% bind_rows(dat) %>% distinct( 就可以了吗?
  • 我已经编辑了这个问题,希望这次更容易理解。很抱歉造成混乱。

标签: r dplyr tidyverse rbind


【解决方案1】:
dat %>% bind_rows(dat2) %>% distinct(id, value, .keep_all = T) %>% 
  arrange(value, id)

结果:

   id value cat_var
1   1     1  orange
2   2     1  orange
3   3     1  orange
4   4     1  orange
5   1     2  orange
6   2     2   green
7   3     2   green
8   4     2   green
9   1     3   green
10  2     3   green
11  3     3     red
12  4     3   green

您不需要安排(只是为了获得与 disered 结果完全相同的数据帧)。

【讨论】:

  • 请注意,它只给出了所需的结果,因为它删除了第二个重复项,并且我确保 dat2 中的重复项是第二个。如果您想要不同的订单或在其他情况下,您需要记住这一点。
【解决方案2】:

使用基础 R:

行绑定 datdat2 并使用 duplicated 保持唯一行。

result <- rbind(dat, dat2)
result <- result[!duplicated(result[, c('id', 'value')]), ]
result

#   id value cat_var
#1   1     1  orange
#2   3     1  orange
#3   1     2  orange
#4   2     2   green
#5   3     2   green
#6   4     2   green
#7   2     3   green
#8   4     3   green
#10  2     1  orange
#12  4     1  orange
#17  1     3   green
#19  3     3     red

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2020-04-03
    • 2021-05-04
    • 2020-09-02
    • 2013-03-05
    相关资源
    最近更新 更多