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

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

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

我的数据frame(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

得到的结果是

1  1
2  1
3  1

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

r dataframe
2个回答
2
投票

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

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

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

Demo


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
© www.soinside.com 2019 - 2024. All rights reserved.