R语言 删除填充了一定数量单元格的列或行

8cdiaqws  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(98)

我希望删除数据框中填充了一个(或一定数量)单元格的列。其他类似的问题/答案都是基于过滤出只有一个唯一的指定值的行来指定的,但是这不是我想要实现的。
请参阅下表并意识到,如果我希望删除填充了三个或更少单元格的列,答案将是删除前三列。对于删除填充了特定数量列的行,也会出现同样的问题。
Tidy/Dplyr答案优先。

df <- structure(list(Site = c("A", "B", "C", "D", "E", "F", "G", "H",  "I"), X1= c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L), X2 = c(0L,  0L, 0L, 0L, 0L, 0L, 0L, 10L, 0L), X3 = c(0L, 0L, 0L, 0L,  0L, 3L, 6L, 0L, 0L), X4 = c(0L, 9L, 4L, 1L, 8L, 6L, 0L,  0L, 0L), X5 = c(6L, 5L, 2L, 5L, 1L, 5L, 2L, 0L, 0L)), class = "data.frame", row.names = c(NA, -9L))

  Site X1 X2 X3 X4 X5
1    A  0  0  0  0  6
2    B  0  0  0  9  5
3    C  0  0  0  4  2
4    D  0  0  0  1  5
5    E  0  0  0  8  1
6    F  0  0  3  6  5
7    G  0  0  6  0  2
8    H  0 10  0  0  0
9    I  3  0  0  0  0
pgvzfuti

pgvzfuti1#

我们可以使用select(where(...))

select(df, where(~ sum(!. %in% c(0, NA)) >= 3))
#   Site X4 X5
# 1    A  0  6
# 2    B  9  5
# 3    C  4  2
# 4    D  1  5
# 5    E  8  1
# 6    F  6  5
# 7    G  0  2
# 8    H  0  0
# 9    I  0  0

(我推断NA也不算,但无论哪种方式,如果你有NA s,那么==无论如何都不能完美地工作。

dxxyhpgq

dxxyhpgq2#

另一种选择是将所有0替换为NA,并使用purrr::map_df(~ sum(!is.na(.)))对其进行计数,然后创建一个命名向量,然后选择具有更多1条目的每一列:

library(dplyr)
library(purrr)

# create a named vector with the count of entries in each column
helper <- df %>% 
  mutate(across(-Site, ~ ifelse(. == 0, NA, .))) %>%
  purrr::map_df(~ sum(!is.na(.))) %>% 
  as_vector()

# select all colums with more the 1 entry 
df_selected<- df %>%
  select(-which(names(.) %in% names(helper)[helper == 1]))

df_selected
Site X3 X4 X5
1    A  0  0  6
2    B  0  9  5
3    C  0  4  2
4    D  0  1  5
5    E  0  8  1
6    F  3  6  5
7    G  6  0  2
8    H  0  0  0
9    I  0  0  0
ntjbwcob

ntjbwcob3#

使用 colSums 计数非零,然后子集:

df[ colSums(df != 0) >= 3 ]
#   Site X4 X5
# 1    A  0  6
# 2    B  9  5
# 3    C  4  2
# 4    D  1  5
# 5    E  8  1
# 6    F  6  5
# 7    G  0  2
# 8    H  0  0
# 9    I  0  0

相关问题