【问题标题】:filter out columns where all values equal 1过滤掉所有值都等于 1 的列
【发布时间】:2019-05-10 16:45:25
【问题描述】:

我有一个巨大的数据框。我想过滤所有值都等于 1 的列。

这是我的数据示例。

A = c(1,2,3,4,5,6,1,1,1,1,1,1,2,3,1,4,5,6,1,1,1,1,1,1,2,3,4,1,3,3,1,1,1,1,1,1)
M  <- matrix(A, ncol = 6, nrow  = 6, byrow = F)


      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    2    1    2    1
[2,]    2    1    3    1    3    1
[3,]    3    1    1    1    4    1
[4,]    4    1    4    1    1    1
[5,]    5    1    5    1    3    1
[6,]    6    1    6    1    3    1

想要的输出如下:

      [,1] [,2] [,3]
[1,]    1    2    2
[2,]    2    3    3
[3,]    3    1    4
[4,]    4    4    1
[5,]    5    5    3
[6,]    6    6    3

我想使用 dplyr 中的过滤器功能或其他 R 功能。 你知道我该怎么做吗? 谢谢

【问题讨论】:

  • 您要使用矩阵还是数据框?

标签: r filter dplyr subset


【解决方案1】:

您可以使用colMeans(M == 1) 获取等于1 的每列的百分比,然后选择该百分比不为1 的那些列(即100%)。

M[, colMeans(M == 1) != 1]

#      [,1] [,2] [,3]
# [1,]    1    2    2
# [2,]    2    3    3
# [3,]    3    1    4
# [4,]    4    4    1
# [5,]    5    5    3
# [6,]    6    6    3

如果你有数据框,dplyr 的解决方案是使用select_if

library(dplyr)

df %>% 
  select_if(~ any(. != 1))

#   V1 V3 V5
# 1  1  2  2
# 2  2  3  3
# 3  3  1  4
# 4  4  4  1
# 5  5  5  3
# 6  6  6  3

请注意,colMeansany 都有一个 na.rm 参数,如果您的数据具有 NA 值,您可以使用该参数。

【讨论】:

    【解决方案2】:

    不知道你的意思,我会同时提供。

    矩阵

    M[, apply(M, 2, function(a) !all(a == 1)) ]
    #      [,1] [,2] [,3]
    # [1,]    1    2    2
    # [2,]    2    3    3
    # [3,]    3    1    4
    # [4,]    4    4    1
    # [5,]    5    5    3
    # [6,]    6    6    3
    

    数据框

    D <- as.data.frame(M)
    D[,sapply(D, function(a) !all(a == 1))]
    #   V1 V3 V5
    # 1  1  2  2
    # 2  2  3  3
    # 3  3  1  4
    # 4  4  4  1
    # 5  5  5  3
    # 6  6  6  3
    

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2023-02-09
      • 1970-01-01
      • 2022-11-23
      • 2022-01-23
      • 2021-12-15
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多