Rでクロス集計（table(X,Y)）をした結果、例えばX*Yが10未満だった行を削除したいのですが、一気にやる方法はありますでしょうか？
CC BY-SA 4.0
2022-05-15T11:52:14.113
88833
2022-05-20T04:54:06.033
52567
question
r
Rのクロス集計から条件をつけて削除
まず確認させていただきたいのですが、table関数で返ってくるのは、XかけるYではなく頻度(=XとYの組み合わせが、元データに何行存在するか)となります。下記がその例です。mpg:10.4とcyl:8の組み合わせが元データに2個あるため2と表示されます。10.4*8=83.2が出てくるわけではありません。

```

    library(tidyverse)
    head(table(mtcars$mpg,mtcars$cyl))
    
           4 6 8
      10.4 0 0 2
      13.3 0 0 1
      14.3 0 0 1
      14.7 0 0 1
      15   0 0 1
      15.2 0 0 2
    
```

貴方が集計したいもの、および10未満かどうかをチェックする対象はいずれも頻度という理解で良いでしょうか？ Yesと仮定して話を進めます。

#### 準備

```

    library(tidyverse)
    # クロス集計関数tabylを含むパッケージ
    library(janitor)
    # ペンギンのデータセットのパッケージ(この説明事例用)
    library(palmerpenguins)
    # ここでは説明の都合上、10ではなく40を基準値とします
    criteria1<-40
    high_low<-function(x){x>=criteria1}
    
```

#### クロス集計

クロス集計はtableでもできますがjanitor::tabylのほうがデータフレームとして結果が取れるので、今回のようにその後の処理をする場合に便利です。Biscoe島の2007年を例にとると44頭のペンギンが観測されたことがわかります。

```

    tab1<-tabyl(penguins,island,year)
    tab1
    
```

```

        island 2007 2008 2009
        Biscoe   44   64   60
         Dream   46   34   44
     Torgersen   20   16   16
    
```

#### 基準値未満だけの行を削除する場合。

Torgersen島が削除されます。

```

    tab2 <- tab1 %>% filter(if_any(c(2:ncol(.)),high_low))
    tab2
    
```

```

     island 2007 2008 2009
     Biscoe   44   64   60
      Dream   46   34   44
    
```

#### 基準値未満が含まれる行を削除する場合。

Dream島とTorgersen島が削除されます。

```

    tab3 <- tab1 %>% filter(if_all(c(2:ncol(.)),high_low))
    tab3
    
```

```

     island 2007 2008 2009
     Biscoe   44   64   60
    
```

#### 基準値未満をNA(欠損値)にする場合。

先述で作ったtab2から作ります。

```

    tab4<-tab2
    options(warn=-1)
    tab4[tab4<criteria1] <- NA
    tab4
    
```

```

     island 2007 2008 2009
     Biscoe   44   64   60
      Dream   46   NA   44
    
```

どの処理が良いか、お好みでご利用ください。
CC BY-SA 4.0
2022-05-19T21:30:52.750
88927
2022-05-20T04:54:06.033
2022-05-20T04:54:06.033
52711
52711
88833
answer