我有一个数据框,例如:
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
感谢您的帮助。
答案 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