示例数据
df <- as.data.frame(rbind(
c("Jim","Dwight","Michael","Andy","Stanley","Creed"),
c("Jim","Dwight","Angela","Pam","Ryan","Jan"),
c("Jim","Dwight","Angela","Pam","Creed","Ryan")
), stringsAsFactors = FALSE)
df
# V1 V2 V3 V4 V5 V6
# 1 Jim Dwight Michael Andy Stanley Creed
# 2 Jim Dwight Angela Pam Ryan Jan
# 3 Jim Dwight Angela Pam Creed Ryan
操作和输出(使用%in% 覆盖列并使用rowSums)
out_lgl <- rowSums(sapply(df, '%in%', unlist(df[3,]))) <= 4
out_lgl
# [1] TRUE FALSE FALSE
which(out_lgl)
# [1] 1
说明:
对于每一列,每个元素都与第三行(向量unlist(df[3,]))进行比较。输出是与df、TRUE 相同维度的逻辑值矩阵(如果有匹配项)。
sapply(df, '%in%', unlist(df[3,]))
# V1 V2 V3 V4 V5 V6
# [1,] TRUE TRUE FALSE FALSE FALSE TRUE
# [2,] TRUE TRUE TRUE TRUE TRUE FALSE
# [3,] TRUE TRUE TRUE TRUE TRUE TRUE
然后我们可以对TRUEs 求和以查看每行的匹配数
rowSums(sapply(df, '%in%', unlist(df[3,])))
# [1] 3 5 6
编辑:
我在上面的df 的创建中添加了stringsAsFactors = FALSE 选项。但是,据我所知,%in% 的输出是相同的,无论是比较具有不同级别或字符的因素,所以我不相信这会以任何方式改变结果。请参阅下面的示例
x <- c('b', 'c', 'z')
y <- c('a', 'b', 'g')
all.equal(x %in% y, factor(x) %in% factor(y))
# [1] TRUE