按R中的模式值删除列

时间:2019-02-27 10:23:35

标签: r dataframe

我有一个数据框,例如:

g1   g2   g3   g4   g5
2    0    1    0    1
2    1    1    0    1
2    1    1    2    1

,我想删除其值中至少有一个2的每一列。

并获得一个新的df:

g2   g3   g5
0    1    1
1    1    1
1    1    1

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

我们可以在此处使用colSums

df <- data.frame(g1=c(2,2,2), g2=c(0,1,1), g3=c(1,1,1), g4=c(0,0,2), g5=c(1,1,1))
df[, !colSums(df==2)]

  g2 g3 g5
1  0  1  1
2  1  1  1
3  1  1  1

该想法是包括原始数据帧中的所有行,但仅包括那些永远不会具有值2的列。在这种情况下,对colSums()的调用将为零,这在逻辑上等效于R中的false

答案 1 :(得分:3)

我们可以将select_if函数与谓词函数结合使用来实现此目的。

library(dplyr)

dat2 <- dat %>% select_if(function(x) !any(x == 2))
dat2
#   g2 g3 g5
# 1  0  1  1
# 2  1  1  1
# 3  1  1  1

数据

dat <- read.table(text = "g1   g2   g3   g4   g5
2    0    1    0    1
                  2    1    1    0    1
                  2    1    1    2    1",
                      header = TRUE, stringsAsFactors = FALSE)

答案 2 :(得分:1)

我们也可以使用purrr

df[,map_lgl(df,~sum(.x==2)<1)]


   g2 g3 g5
1  0  1  1
2  1  1  1
3  1  1  1