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

从R中的数据帧中删除0列,r,dataframe,R,Dataframe,我知道以前有人问过这个问题,但他们提供的解决方案在我的案例中给出了一些奇怪的结果 我的数据帧(df)是这样的吗 Department1 Department2 Department3 Cafeteria Lobby(TT) Lobby(Music Band) James 0 1 0 0 0 0 Flynn 0 1

我知道以前有人问过这个问题,但他们提供的解决方案在我的案例中给出了一些奇怪的结果

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

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

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

df <- df[, colSums(df != 0) > 0, drop=FALSE]
df 0,drop=FALSE]
这将告诉R不要将数据帧强制降到最低维度,在本例中,这是一个数值向量。正如您似乎已经注意到的,如果您有多个非零和列,那么强制将不是问题


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

df <- df[, colSums(df != 0) > 0, drop=FALSE]
df 0,drop=FALSE]
这将告诉R不要将数据帧强制降到最低维度,在本例中,这是一个数值向量。正如您似乎已经注意到的,如果您有多个非零和列,那么强制将不是问题


对于类似的任务,我已经习惯于使用
purr::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
库(TIBLE)
图书馆(dplyr)
图书馆(purrr)
df%
列到行名称(“名称”)%>%
保持(~all(.x)!=0)
#部门2
#詹姆斯1
#弗林1
#利亚姆1

对于类似的任务,我已经习惯于使用
purr::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
库(TIBLE)
图书馆(dplyr)
图书馆(purrr)
df%
列到行名称(“名称”)%>%
保持(~all(.x)!=0)
#部门2
#詹姆斯1
#弗林1
#利亚姆1

我删除了它,因为一个true
colSums(df)==0
并不一定意味着该列包含所有零。我想,
df[colSums(df==0)==0]
会更好。@RichScriven-Right…但我认为如果OP有所有数字都是正数的约束,那就可以了。然后,一个列可以有零和的唯一方法是如果每个数字都是零。我删除了它,因为true
colSums(df)==0
并不一定意味着该列包含所有零。我想,
df[colSums(df==0)==0]
会更好。@RichScriven-Right…但我认为如果OP有所有数字都是正数的约束,那就可以了。那么,一个列的和为零的唯一方法就是如果每个数字都为零。