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