【问题标题】:How to print observations existing in one dataframe and missing from the other r?如何打印存在于一个数据框中并从另一个 r 中丢失的观察结果?
【发布时间】:2020-06-21 10:03:27
【问题描述】:

我有一个包含 3719 行(实际数据)行的数据框和另一个包含 3721 行(来自编码)的数据框。我得到了 2 个额外的观察结果。

我尝试过使用 setdiff,但它给出的行数为零

dplyr::setdiff(d1,d2)

o/p: [1] col1 col2 col3 col4       
     [5] col5 col6                
<0 rows> (or 0-length row.names)

我也试过反之亦然,即

dplyr::setdiff(d2,d1)

o/p: [1] col1 col2 col3 col4       
     [5] col5 col6                
<0 rows> (or 0-length row.names)

如何识别 R 中的那 2 个额外观察?

【问题讨论】:

  • 您的“data.frames”是如何定义的? tibbles,tribbles,data.frames,...?也许看到这个问题:github.com/tidyverse/dplyr/issues/4317
  • 您可以尝试which(d1$col1[1:3719] != d2$col1[1:3719])[1] 获取col1 中的第一个不匹配条目

标签: r dplyr set-difference


【解决方案1】:

选项 1 您可以使用 %in% 运算符

#Make Fake Data
a <- mtcars
b <- mtcars[ 3:nrow(mtcars) , ] 

a$id <- rownames( a )
b$id <- rownames( b )

#In A not B
a[ !(a$id %in% b$id) , ]
#In B not A
b[ !(b$id %in% a$id) , ]

选项 2 - 使用与 all=T 合并

a$flaga <- 1
b$flagb <- 1

d <- merge( a[ ,c("id","flaga")] , b[ ,c("id","flagb")], by= "id" , all=T)

d[ is.na(d$flaga) | is.na(d$flagb) , "id" ]

【讨论】:

  • 谢谢。知道了 2 个缺失的观察结果
【解决方案2】:

反加入将是“整洁”的选项:

library(tidyverse)

d1 <- tribble(~a, ~b,
              "a", 3,
              "f", 9,
              "g", 10)

d2 <- tribble(~a, ~b,
              "a", 333,
              "b", 999,
              "f", 444,
              "g", 111)

d2 %>%
  anti_join(d1, by = "a")

# A tibble: 1 x 2
# a         b
# <chr> <dbl>
#   1 b       999

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2021-09-06
    • 2016-10-04
    • 2016-09-10
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多