从R中的数据框中删除0列

时间:2017-12-27 06:02:24

标签: r dataframe

我之前已经问过这个问题但是他们提供的解决方案在我的案例中给出了一些奇怪的结果。

我的数据框(df)就是这个

         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

我想要的结果是

       Department2  
James  1           
Flynn  1           
Liam   1           

用于删除零列的代码是

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

上面的代码是由

拍摄的

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

结果get是

1  1
2  1
3  1

当有多个列包含除零之外的其他值时,上面的代码可以正常工作。在这种情况下如何获得理想的结果?

2 个答案:

答案 0 :(得分:2)

问题的直接解决方法是在对数据框进行子集化时使用drop=FALSE

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

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

Demo

答案 1 :(得分:2)

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

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