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