【问题标题】:Is there a good R function for separating unique column values between two data frames, keeping rows?是否有一个很好的 R 函数来分离两个数据帧之间的唯一列值,保持行?
【发布时间】:2021-06-13 20:54:33
【问题描述】:

基本上我有 2 个具有这种基本结构的数据框:

Col1 Col2 Col3 Col4
aaa 12 xxx 32b
tfe 21 xxx 14f
eed 12 xxx 54b
wes 95 xxx 54r
rtf 44 xxx 99q
fvg 87 xxx 55h

所以第 1 列中的一些值在两个数据帧中重复,我想创建一个新数据帧,其中每个数据帧只有 Col1 中具有唯一值的行,所以在伪代码中:

Unique_to_df1

我尝试了一些函数,但它们要么似乎只导出 Col1 的唯一值,而不是整个表,要么似乎只适用于从一个数据帧中删除重复值,而不是在两个数据帧之间进行比较。任何帮助/建议将不胜感激!

【问题讨论】:

  • 看看setdiff
  • 喜欢内连接?

标签: r dataframe


【解决方案1】:

您可以使用setdiff 为每个数据帧选择Col1 中具有唯一值的行

x[x$Col1 %in% setdiff(x$Col1, y$Col1),]
#x[!x$Col1 %in% intersect(x$Col1, y$Col1),] #Alternative
#  Col1 Col2 Col3 Col4
#1  aaa   12  xxx  32b

y[y$Col1 %in% setdiff(y$Col1, x$Col1),]
#  Col1 Col2 Col3 Col4
#1  bbb   12  xxx  32b

数据:

x <- read.table(header=TRUE, text="Col1     Col2    Col3    Col4
aaa     12  xxx     32b
tfe     21  xxx     14f
eed     12  xxx     54b
wes     95  xxx     54r
rtf     44  xxx     99q
fvg     87  xxx     55h")
y <- x
y[1,1] <- "bbb"

【讨论】:

    【解决方案2】:

    anti_join(x, y) 删除 x 中与 y 匹配的所有观测值。

    df1 <- data.frame(
      stringsAsFactors = FALSE,
                  Col1 = c("aaa", "tfe", "eed", "wes", "rtf", "fvg"),
                  Col2 = c(12L, 21L, 12L, 95L, 44L, 87L),
                  Col3 = c("xxx", "xxx", "xxx", "xxx", "xxx", "xxx"),
                  Col4 = c("32b", "14f", "54b", "54r", "99q", "55h")
    )
    
    
    df2 <- data.frame(
      stringsAsFactors = FALSE,
                  Col1 = c("a", "tfe", "ee", "ws", "rt", "fvg"),
                  Col2 = c(12L, 21L, 12L, 95L, 44L, 87L),
                  Col3 = c("xxx", "xxx", "xxx", "xxx", "xxx", "xxx"),
                  Col4 = c("32b", "14f", "54b", "54r", "99q", "55h")
    )
    
    library(dplyr)
    
    unique1 <- df1 %>% 
      anti_join(df2)
    
    unique2 <- df2 %>% 
      anti_join(df1)
    
    
    # Join them together:
    
    rbind(unique1, unique2)
    
    #>   Col1 Col2 Col3 Col4
    #> 1  aaa   12  xxx  32b
    #> 2  eed   12  xxx  54b
    #> 3  wes   95  xxx  54r
    #> 4  rtf   44  xxx  99q
    #> 5    a   12  xxx  32b
    #> 6   ee   12  xxx  54b
    #> 7   ws   95  xxx  54r
    #> 8   rt   44  xxx  99q
    

    reprex package (v0.3.0) 于 2021-03-16 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2021-11-05
      • 2020-08-21
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多