当前位置: 首页 > 知识库问答 >
问题:

是否有一个好的R函数用于分离两个数据帧之间的唯一列值,并保留行?

聂琨
2023-03-14

基本上,我有2个数据帧,具有以下基本结构:

因此,列1中的一些值在两个数据帧中都是重复的,我想创建一个新的数据帧,其中每个数据帧的Col1中只有具有唯一值的行,因此在psuedo代码中:

唯一的\u到\u df1

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

共有2个答案

彭华皓
2023-03-14

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软件包(v0.3.0)于2021-03-16创建

汝岳
2023-03-14

您可以使用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"
 类似资料:
  • 我有两个数据帧,它们共享多个公共列,如下所示: 第一个: 而第二个: 我想保留中的行,其列也存在于中。例如,df2的第27行有值,对于,这些值并不都存在于(因为df1只对列有值

  • 我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集:

  • 我有两个熊猫数据帧共享一个共同的列名。我想合并公共列名,但保留与第二个dataFrame中的所有不同列,其中公共列名称匹配。下面是两个数据帧的示例: 我希望预期的结果是: 也就是说,当列“A”匹配时,我希望保留I,J,K,L的行,并且不等于“NaN ”,对于DF1中的列也是如此。 我已经尝试了所有的pd.merge选项,但是它们似乎没有做我上面要求的事情。例如, 在“A”上匹配并将所有键保留在左侧

  • 我有两个数据帧,它们的列名相同,但行数不同。第一个数据帧(a)看起来与此类似: 注:站点5、6、8和12故意丢失。 第二个数据帧(b)看起来像这样: 我想要实现的是: 在那里我注入(我肯定有一个更好的术语)数据帧b到数据帧a的数据,但是我想用零替换b中的任何NAs,并保持a中的NAs不变。 我发现并尝试了这个代码: 但它会带来NAs。我考虑先将NAs替换为零,但即使如此,它也会抹去我目前在数据帧a

  • 这是我的密码: 我想知道如何将df3绑定到单个数据帧中作为"NA"s? 我在r_blogger上找到了一篇关于将向量或长度不等的数据帧组合成一个数据帧的文章。http://www.r-bloggers.com/r-combining-vectors-or-data-frames-of-unequal-length-into-one-data-frame/ 但是我从数据中得到的数据框,其中一些是空的

  • 我在dataframe中总共有100列。我试图比较两个数据帧,并找到列名不匹配的记录。我得到了以下代码的输出,但当我运行100列的代码时,作业被中止。 我正在为SCD类型2增量进程错误查找执行此操作。 请建议任何其他方式。