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

1つのオプションは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    

またはのバージョンacrossから使用するdeveldplyr

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))

Update2

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 に答える