从数据框中移除包含跨列重复信息的行

  • 本文关键字:信息 包含跨 数据 r
  • 更新时间 :
  • 英文 :

col1 <- c('A','B','C', 'D')
col2 <- c('B','A','C', 'C')
col3 <- c('B','C','C', 'A')
dat <- data.frame(cbind(col1, col2, col3))
dat
  col1 col2 col3
1    A    B    B
2    B    A    C
3    C    C    C
4    D    C    A
我想从 dat 中删除第 1 行和第 3 行,因为字母 B 在第 1 行中多次出现

,而字母 C 在第 3 行中多次出现。

编辑:

我的实际数据包含超过 100 万行和 14 列,所有这些行和列都包含字符数据。首选运行最快的解决方案,因为我在实时设置中使用数据帧来做出决策,并且基础数据每隔几分钟就会更改一次。

你可以试试这个(但我相信有更好的方法(

cols <- ncol(dat)
indx <- apply(dat, 1, function(x) length(unique(x)) == cols)
dat[indx, ]
#   col1 col2 col3
# 2    B    A    C
# 4    D    C    A

另一种方式(如果您的列是字符并且您没有太多列(类似于以下内容(矢量化(

indx <- with(dat, (col1 == col2) | (col1 == col3) | (col2 == col3))
dat[!indx, ]
#   col1 col2 col3
# 2    B    A    C
# 4    D    C    A
如果你

不介意指定列,你可以在 dplyr 中执行此操作:

library(dplyr)
dat %>%
  rowwise() %>%
  mutate(repeats = max(table(c(col1, col2, col3))) - 1) %>%
  filter(repeats == 0) %>%
  select(-repeats) # if you don't want that column to appear in results

Source: local data frame [2 x 3]
  col1 col2 col3
1    B    A    C
2    D    C    A

这是一个替代方案。 我还没有在大数据集上测试过,

library(data.table) #devel version v1.9.5
dat[setDT(melt(as.matrix(dat)))[,uniqueN(value)==.N , Var1]$V1,]
#    col1 col2 col3
#2    B    A    C
#4    D    C    A

或使用anyDuplicated

 dat[!apply(dat, 1, anyDuplicated),]
 #   col1 col2 col3
 #2    B    A    C
 #4    D    C    A

最新更新