筛选出所有值均等于1的列

时间:2018-12-09 16:57:06

标签: r filter dplyr subset

我有一个巨大的数据框。我想过滤所有其值都等于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函数中的过滤器函数。 你知道我该怎么做吗? 谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用@Override public void start(Stage stage) throws Exception { HBox container = new HBox(20); container.setPrefHeight(40); Button addFirst = new Button("add head"); Button addLast = new Button("add tail"); Button remove = new Button("remove"); TextField textField = new TextField(); HBox buttonContainer = new HBox(10, textField, addFirst, addLast, remove); final LinkedList<Integer> list = new LinkedList<>(); addFirst.setOnAction(evt -> { String text = textField.getText(); Integer value = Integer.parseInt(text); list.addFirst(value); container.getChildren().add(0, new Label(text)); }); addLast.setOnAction(evt -> { String text = textField.getText(); Integer value = Integer.parseInt(text); list.addLast(value); container.getChildren().add(new Label(text)); }); remove.setOnAction(evt -> { String text = textField.getText(); int value = Integer.parseInt(text); ListIterator<Integer> iterator = list.listIterator(); while (iterator.hasNext()) { Integer element = iterator.next(); if (element == value) { container.getChildren().remove(iterator.nextIndex() - 1); iterator.remove(); break; } } }); VBox root = new VBox(container, buttonContainer); Scene scene = new Scene(root, 500, 400); stage.setScene(scene); stage.show(); } 获取等于colMeans(M == 1)的每一列的百分比,然后选择那些百分比不等于1(即100%)的列。

1

如果您有数据框,则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 colMeans都有一个any参数,如果您的数据具有na.rm值,则可以使用该参数。

答案 1 :(得分:1)

不确定您的意思,我会同时提供。

矩阵

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