R 从数据帧中删除也出现在另一个数据帧中的值

R 从数据帧中删除也出现在另一个数据帧中的值,r,R,我有两个数据帧,df1包含许多值,df2包含一些也出现在df1中的值。df2中的值是我想从df1中删除的值 我曾尝试通过合并来实现这一点,但这似乎没有一个选项可以只保留不在两者中的值 我还试着使用从到类似问题的代码。 这似乎是可行的,但它生成的数据帧的值比我预期的要少,即df1包含74911个值,df2包含767个值,删除这些值后,剩下74064个数据帧,因此又删除了80行。我不知道为什么会发生这种情况,如果我能识别出80行,也许我能找到它 如果有人能想出另一种方法来实现我的目标,我将非常感激

我有两个数据帧,
df1
包含许多值,
df2
包含一些也出现在
df1
中的值。
df2
中的值是我想从
df1
中删除的值

我曾尝试通过合并来实现这一点,但这似乎没有一个选项可以只保留不在两者中的值

我还试着使用从到类似问题的代码。 这似乎是可行的,但它生成的数据帧的值比我预期的要少,即
df1
包含74911个值,
df2
包含767个值,删除这些值后,剩下74064个数据帧,因此又删除了80行。我不知道为什么会发生这种情况,如果我能识别出80行,也许我能找到它

如果有人能想出另一种方法来实现我的目标,我将非常感激

以下是一些示例数据帧,它们与真实数据帧相比非常简单:

chrom <- c(1, 2, 3, 4)
pos <- c(2, 7, 9, 14)
seq_c <- c('A', 'G', 'C', 'T')
seq_k <- c('G', 'C', 'A', 'C')
df1 <- data.frame(chrom, pos, seq_c, seq_k)

chrom <- c(1, 2)
pos <- c(2, 7)
seq_c <- c('A', 'G')
seq_k <- c('G', 'C')
df2 <- data.frame(chrom, pos, seq_c, seq_k)

chrom我们可以使用
dplyr
中的
anti_join
,它将删除'df1'和'df2'之间常见的行,并仅保留其余行

 library(dplyr)
 anti_join(df1, df2)

下面是一个使用
merge()
然后从
df1
中删除与
df2
成功合并的所有行索引的想法:

df1[-merge(cbind(df1,ri=seq_len(nrow(df1))),df2)$ri,];
##   chrom pos seq_c seq_k
## 3     3   9     C     A
## 4     4  14     T     C
而data.table有一种很好的优雅方式:

library('data.table');
dt1 <- data.table(df1,key=names(df1));
dt2 <- data.table(df2,key=names(df2));
dt1[!dt2];
##    chrom pos seq_c seq_k
## 1:     3   9     C     A
## 2:     4  14     T     C
library('data.table');

dt1我使用stringAsFactors=FALSE重新创建了data.frame,在这种情况下,您可以从dplyr使用setdiff:

chrom <- c(1, 2, 3, 4)
pos <- c(2, 7, 9, 14)
seq_c <- c('A', 'G', 'C', 'T')
seq_k <- c('G', 'C', 'A', 'C')
df1 <- data.frame(chrom, pos, seq_c, seq_k, stringsAsFactors = FALSE)

chrom <- c(1, 2)
pos <- c(2, 7)
seq_c <- c('A', 'G')
seq_k <- c('G', 'C')
df2 <- data.frame(chrom, pos, seq_c, seq_k, stringsAsFactors = FALSE)

library(dplyr)
df1 %>% setdiff(df2)

chrom此操作非常有效,我得到了预期的74144行。非常感谢你!在data.table的devel版本中,您不需要设置键,只需使用
on=
,这听起来像是一个很酷的函数,但是dplyr不适用于我的R版本(3.1.1),bgoldst的答案对我很有用。谢谢你的建议!是否要删除整行存在于另一个数据帧中的行(而不是存在于另一个数据帧中的单个ID键值)?这一点,以及您是否有重复的键变量值,可能会影响删除的行数比预期的多。即整行出现在另一个数据帧中的行数。
chrom <- c(1, 2, 3, 4)
pos <- c(2, 7, 9, 14)
seq_c <- c('A', 'G', 'C', 'T')
seq_k <- c('G', 'C', 'A', 'C')
df1 <- data.frame(chrom, pos, seq_c, seq_k, stringsAsFactors = FALSE)

chrom <- c(1, 2)
pos <- c(2, 7)
seq_c <- c('A', 'G')
seq_k <- c('G', 'C')
df2 <- data.frame(chrom, pos, seq_c, seq_k, stringsAsFactors = FALSE)

library(dplyr)
df1 %>% setdiff(df2)