如果B是作为a子集的数据帧,我如何从a数据帧中删除整个B数据帧(在R中)

  • 本文关键字:数据帧 删除 子集 如果 r dataframe
  • 更新时间 :
  • 英文 :


我想删除作为另一个数据帧子集的数据帧:如果B是作为另一数据帧A子集的数据框,我如何从A中删除整个B数据帧?

可复制示例:

A<-data.frame(text = c("Hello I am John","Hello boys","Hello girls","Hello 
world"), created=c(as.POSIXct("2020-03-18 11:00:29"),as.POSIXct("2020-05- 
11 11:00:11"),as.POSIXct("2020-01-10 00:00:29"), as.POSIXct("2020-03-19 
11:11:11")), name=c("John","Anya","Pier","Joe"), stringsAsFactors = FALSE)

B是,例如,的第一行和第三行

考虑这样的函数

row_matched <- function(df1, df2) {
stopifnot(
identical(ncol(df1), ncol(df2)), 
all(names(df1) == names(df2))
)
pos <- mapply(match, df1, df2, list(nomatch = 0L))
rowSums(!(pos > 0L & pos == pos[, 1L])) < 1L
}

然后你可以只

A[!row_matched(A, B), ]

输出

text             created name
2  Hello boys 2020-05-11 11:00:11 Anya
4 Hello world 2020-03-19 11:11:11  Joe

通过一个例子可以更好地理解这一点。您需要测试所有值,以便使用do.call()paste0():

#Data
A <- as.data.frame(matrix(c(1,0),5,5))
B <- A[c(2,4),]
A
V1 V2 V3 V4 V5
1  1  0  1  0  1
2  0  1  0  1  0
3  1  0  1  0  1
4  0  1  0  1  0
5  1  0  1  0  1
B
V1 V2 V3 V4 V5
2  0  1  0  1  0
4  0  1  0  1  0

现在,我们删除:

#Remove
NewA <- A[!do.call(paste0, A) %in% do.call(paste0, B),]

输出:

V1 V2 V3 V4 V5
1  1  0  1  0  1
3  1  0  1  0  1
5  1  0  1  0  1

它也适用于您的数据:

#Data
A<-data.frame(text = c("Hello I am John","Hello boys","Hello girls","Hello world"), created=c(as.POSIXct("2020-03-18 11:00:29"),as.POSIXct("2020-05-11 11:00:11"),as.POSIXct("2020-01-10 00:00:29"), as.POSIXct("2020-03-19 11:11:11")), name=c("John","Anya","Pier","Joe"), stringsAsFactors = FALSE)
B <- A[c(2,4),]
#Remove
NewA <- A[!do.call(paste0, A) %in% do.call(paste0, B),]

输出:

text             created name
1 Hello I am John 2020-03-18 11:00:29 John
3     Hello girls 2020-01-10 00:00:29 Pier

最新更新