1

我有一个非常大的数据集,我想通过删除我选择的列满足这些列选择中的所有条目都等于 0 的条件的行来清理。这是我目前拥有的:

df1 <- filter(df,((n)==0 & (n+1)==0 & (n+2)==0 & (n+3)==0 & ......(n+100)==0)

如何执行此操作,以便删除每第 n 列满足此条件的所有行条目?

另外,如果我想迭代这个条件,我需要说明列的名称吗?

这是一个示例数据集:

 A tibble: 10 x 10
 A B C D E F G H I J
 1 1 1 1 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 1 1 1 0 0 0 1 1
 0 0 0 0 0 0 0 0 0 0
 1 1 1 1 1 1 1 0 1 1
 1 1 1 1 1 0 0 0 0 0 
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 1 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0

我想删除 F、G 和 H 列等于 0 的所有行,我的结果将是:

 A tibble: 10 x 2
 A B C D E F G H I J
 1 1 1 1 1 1 1 0 1 1
 0 0 0 0 0 0 0 1 0 0
4

1 回答 1

0

一种选择是filter_at

library(dplyr)
df %>%
   filter_at(11:20, any_vars( .  != 0))

一个可重现的例子

df1 %>% 
   filter_at(vars(`11`:`13`), any_vars(. != 0))
# A tibble: 2 x 4
#   `11`  `12`  `13` grp  
#     <dbl> <dbl> <dbl> <chr>
#1     1     0     4 a    
#2     0     1     0 b    

或者acrossdevel版本中使用dplyr

df1 %>%
    filter(across(cols = matches('^\\d+$'), ~ (.x == 0))) %>% 
    anti_join(df1, .)
# A tibble: 2 x 4
#   `11`  `12`  `13` grp  
#  <dbl> <dbl> <dbl> <chr>
#1     1     0     4 a    
#2     0     1     0 b    

更新

根据 OP 的更新,如果我们将“n”作为某个列索引并且想要基于从该位置到之后的 100 列进行过滤

n <- 5
df %>%
     filter_at(n:(n+100), any_vars(. != 0))

更新2

df2 %>%
   filter_at(vars(F, G, H), any_vars(. != 0))
# A tibble: 2 x 10
#      A     B     C     D     E     F     G     H     I     J
#  <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1     1     1     1     1     1     1     1     0     1     1
#2     0     0     0     0     0     0     0     1     0     0

或使用base R

df2[rowSums(df2[c("F", "G", "H")] != 0) > 0,]

数据

df1 <- tibble(`11` = c(1, 0, 0), `12` = c(0, 1, 0), `13` = c(4,  0, 0), 
  grp = letters[1:3])





df2 <- structure(list(A = c(1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), 
    B = c(1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), C = c(1L, 
    0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), D = c(1L, 0L, 1L, 0L, 
    1L, 1L, 0L, 0L, 0L, 0L), E = c(1L, 0L, 1L, 0L, 1L, 1L, 0L, 
    0L, 1L, 0L), F = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L
    ), G = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), H = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), I = c(0L, 0L, 1L, 0L, 
    1L, 0L, 0L, 0L, 0L, 0L), J = c(0L, 0L, 1L, 0L, 1L, 0L, 0L, 
    0L, 0L, 0L)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))
于 2020-02-26T22:00:21.607 回答