首页 > 解决方案 > 如何根据两个条件选择列?

问题描述

我有一个包含很多列的数据框。例如:

sample treatment col5 col6 col7
  1        a       3    0   5  
  2        a       1    0   3
  3        a       0    0   2
  4        b       0    1   1

我想选择sampletreatment列以及满足以下两个条件的所有列:

  1. 它们在treatment == 'b'0行中的值
  2. 它们的值至少来自treatment == 'a'为0 的一行。

预期结果应如下所示:

sample treatment col5
  1        a       3      
  2        a       1      
  3        a       0      
  4        b       0       

示例数据框:

structure(list(sample = 1:4, treatment = structure(c(1L, 1L, 
1L, 2L), .Label = c("a", "b"), class = "factor"), col5 = c(3, 
1, 0, 0), col6 = c(0, 0, 0, 1), col7 = c(5, 3, 2, 1)), class = "data.frame", row.names = c(NA, 
-4L))

标签: rdplyrsubset

解决方案


这是base R中的一种方法-

cs_a <- colSums(df[df$treatment == "a",-c(1:2)]) > 0
cs_b <- colSums(df[df$treatment == "b",-c(1:2)]) == 0

df[, c(TRUE, TRUE, cs_a & cs_b)]

  sample treatment col5
1      1         a    3
2      2         a    1
3      3         a    0
4      4         b    0

dplyr-

df %>% 
  select_at(which(c(TRUE, TRUE, cs_a & cs_b)))

推荐阅读