首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于多列条件的子集

基于多列条件的子集
EN

Stack Overflow用户
提问于 2022-07-28 11:41:05
回答 2查看 44关注 0票数 1

我有一张基于“颜色列表”的组合表:

代码语言:javascript
复制
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“或根本没有”空“的行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-28 11:52:17

使用您的代码,您可以执行以下操作:

代码语言:javascript
复制
# 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),]

元素rem1rem2可以组合成一个唯一的对象;但是,我将它们分开,以便您可以看到哪些索引满足每个条件。

票数 0
EN

Stack Overflow用户

发布于 2022-07-28 11:59:32

base解决方案:

代码语言:javascript
复制
combo[!(rowSums(combo == 'ID') > 1 | rowSums(combo == 'EMPTY') > 1), ]

使用dplyr,您还可以使用rowSums + across()

代码语言:javascript
复制
library(dplyr)

combo %>%
  filter( !(rowSums(across(A:D) == 'ID') > 1 | rowSums(across(A:D) == 'EMPTY') > 1) )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73152293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档