如何根据属性选择列?

问题描述 投票:0回答:2

我有一个包含以下三个值的数据框:0、1 和 ?。 0 和 1 是字符而不是数字数据。我正在尝试对数据框进行子集化以删除以下内容:

  1. 所有一致为 0 或 1 的列
  2. 所有列至少有一个 ?

所以数据集应该没有不变的列或有缺失值的列。

这里是数据框的图示:

   c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
r1 0  1  0  1  ?  ?  ?  ?  0  1
r2 0  1  0  1  1  0  ?  ?  0  1
r3 0  1  0  1  1  0  0  1  1  0
r4 0  1  0  1  1  0  0  1  1  0
r5 0  1  0  1  1  0  0  1  ?  1
r6 0  1  0  1  1  0  0  1  ?  0
r7 0  1  1  0  1  0  0  1  0  0

所以我想排除c1、c2、c5、c6、c7、c8、c9。我如何在 base R 或 tidyverse 中执行此操作?

r dataframe tidyverse data-wrangling
2个回答
3
投票

在 tidyverse 中:

df %>% select_if(~!any(.x == '?') & !all(.x == 1) & !all(.x == 0))
   c3 c4 c10
r1  0  1   1
r2  0  1   1
r3  0  1   0
r4  0  1   0
r5  0  1   1
r6  0  1   0
r7  1  0   0

2
投票
> sapply(df,is.integer) & colMeans(df==0)<1 & colMeans(df==1)<1
   c1    c2    c3    c4    c5    c6    c7    c8    c9   c10 
FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
© www.soinside.com 2019 - 2024. All rights reserved.