我之前已经问过这个问题但是他们提供的解决方案在我的案例中给出了一些奇怪的结果。
我的数据框(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
当有多个列包含除零之外的其他值时,上面的代码可以正常工作。在这种情况下如何获得理想的结果?
答案 0 :(得分:2)
问题的直接解决方法是在对数据框进行子集化时使用drop=FALSE
:
df <- df[, colSums(df != 0) > 0, drop=FALSE]
这将告诉R不要将数据帧强制降低到最低维度,在这种情况下是最小维度。正如您似乎已经注意到的那样,如果您有多个非零和列,强制就不会成为问题。
答案 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