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

时间:2015-03-24 13:27:26

标签: 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列,所有这些行都包含字符数据。运行速度最快的解决方案是首选,因为我在实时设置中使用数据框来做出决策,而基础数据每隔几分钟就会发生变化。

3 个答案:

答案 0 :(得分:4)

你可以试试这个(但我确定有更好的方法)

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

答案 1 :(得分:3)

如果您不介意指定列,可以在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

答案 2 :(得分:2)

这是另一种选择。我还没有在大数据集上测试过,

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