关于数据框:从R中的数据框中删除0列

Remove 0 columns from a data frame in R

我看到之前曾有人问过这个问题,但是在我的情况下,他们提供的解决方案给出了一些奇怪的结果。

我的数据帧(df)是这个

1
2
3
4
         Department1  Department2  Department3  Cafeteria  Lobby(TT)  Lobby(Music Band)
  James  0            1            0            0          0          0
  Flynn  0            1            0            0          0          0
  Liam   0            1            0            0          0          0

我想要的结果是

1
2
3
4
       Department2  
James  1          
Flynn  1          
Liam   1

我用于删除零列的代码是

1
df <- df[, colSums(df != 0) > 0]

以上代码已被该

采用

https://stackoverflow.com/a/21530306/7857035

结果为

1
2
3
1  1
2  1
3  1

以上代码在包含不为零的不同值的一列以上时起作用。在这种情况下如何获得期望的结果?


我已经习惯于使用purrr::keep来完成与此类似的任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(tibble)
library(dplyr)
library(purrr)

df <- read.table(text ="
name   Department1  Department2  Department3  Cafeteria  lobby_TT   lobby_music
James  0            1            0            0          0          0
Flynn  0            1            0            0          0          0
Liam   0            1            0            0          0          0",
                 header = TRUE, stringsAsFactor = FALSE)

df %>%
  column_to_rownames("name") %>%
  keep(~all(.x) != 0)

#       Department2
# James           1
# Flynn           1
# Liam            1

您的问题的立即解决是在设置数据帧时使用drop=FALSE

1
df <- df[, colSums(df != 0) > 0, drop=FALSE]

这将告诉R不要将数据帧强制降低到最低维度,在这种情况下,这是一个数字矢量。正如您似乎已经注意到的,如果您有多个非零和列,那么强制将不是问题。

演示