美文网首页
R语言:找出两个dataframe中的非重复行

R语言:找出两个dataframe中的非重复行

作者: 生信频道 | 来源:发表于2020-02-26 21:18 被阅读0次

两个dataframe,df1和df2。找出dataframe中的非重复行 (unique rows)。
df1

df1 <- data.frame(id=c(1:5), animal=c("cat", "dog", "parakeet", "lion", "duck"))

df1
  id   animal
1  1      cat
2  2      dog
3  3 parakeet
4  4     lion
5  5     duck

df2

df2 <- table1[c(1,3,5),]

df2
  id   animal
1  1      cat
3  3 parakeet
5  5     duck

方法1. anti_join from dplyr

library(dplyr)
anti_join(df1, df2)

# Joining, by = c("id", "animal")
#   id animal
# 1  2    dog
# 2  4   lion

方法2. setdiff from dplyr

library(dplyr)
setdiff(df1, df2)

setdiffanti_join都是dplyr里面的function,这两个函数有什么区别呢?
setdiff 要求两个dataframe要有同样的列,而anti_join只需要两个dataframe之间有任意一列列名一样就可以。

df1 <- data.frame(id=c(1:5), A=c(10, 11, 12, 13, 14), B = c("a", "b", "c", "d", "d"))
df2 <- data.frame(id=c(1:3), A=c(10, 100, 1000))

df1
  id  A B
1  1 10 a
2  2 11 b
3  3 12 c
4  4 13 d
5  5 14 d

df2
  id    A
1  1   10
2  2  100
3  3 1000

setdiff(df1,df2)
# 错误: not compatible: Cols in x but not y: `B`.

anti_join(df1, df2)
# Joining, by = c("id", "A")
#   id  A B
# 1  2 11 b
# 2  3 12 c
# 3  4 13 d
# 4  5 14 d

# anti_join还可以自定义想要比对的列,比如,用id这一列来比较,找出df1中独有的行:
anti_join(df1, df2, by="id")
#   id  A B
# 1  4 13 d
# 2  5 14 d

方法3. Try the %in% command and reverse it with !

找出df1中animal这列不在(! %in%)df2中animal的元素/行

df1[!df1$animal %in% df2$animal, ]

方法4. 用data.table

library(data.table)
setkey(setDT(df1))[!df2]
#    id animal
# 1:  2    dog
# 2:  4   lion

相关文章

网友评论

      本文标题:R语言:找出两个dataframe中的非重复行

      本文链接:https://www.haomeiwen.com/subject/tskichtx.html