我有一张基于“颜色列表”的组合表:
library(tidyr)
#give available colour combo
colour= c("BK", "CS", "DB","DG","LB","LG","MV","OR","RD","WT","YL","ID","EMPTY")
combo = expand.grid(colour, colour,colour, colour)
#function "colnames" to change column names
colnames(combo) <- c('A','B','C','D')然而,我并不是对所有可能的组合感兴趣。我想通过删除我不想要的组合来过滤这个表。例如,删除具有多于一个"ID“的行和有超过一个”空“的行。(删除行,如:"ID或LB“或”空ID LB空“。
我还想删除完全没有"ID“或根本没有”空“的行。
发布于 2022-07-28 11:52:17
使用您的代码,您可以执行以下操作:
# Indices of rows with more than 1 "EMPTY"
rem1 <- which(apply(combo,1,function(x) sum(x=="EMPTY"))>=2)
# Indices of rows with more than one "ID"
rem2 <- which(apply(combo,1,function(x) sum(x=="ID"))>=2)
# Subtract rows in "rem1" and "rem2" to get combo2
combo2 <- combo[-c(rem1, rem2),]元素rem1和rem2可以组合成一个唯一的对象;但是,我将它们分开,以便您可以看到哪些索引满足每个条件。
发布于 2022-07-28 11:59:32
base解决方案:
combo[!(rowSums(combo == 'ID') > 1 | rowSums(combo == 'EMPTY') > 1), ]使用dplyr,您还可以使用rowSums + across()
library(dplyr)
combo %>%
filter( !(rowSums(across(A:D) == 'ID') > 1 | rowSums(across(A:D) == 'EMPTY') > 1) )https://stackoverflow.com/questions/73152293
复制相似问题