井出草平の研究ノート

条件を指定して行を削除する[R]

www.datasciencemadesimple.com

特定の列の特定の値のケースを削除

サンプルデータを作成

df1 = data.frame(Name = c('George','Andrea', 'Micheal','Maggie','Ravi','Xien','Jalpa'), 
                 Grade_score=c(4,6,2,9,5,7,8),
                 Mathematics1_score=c(45,78,44,89,66,49,72),
                 Science_score=c(56,52,45,88,33,90,47))

データ。

     Name Grade_score Mathematics1_score Science_score
1  George           4                 45            56
2  Andrea           6                 78            52
3 Micheal           2                 44            45
4  Maggie           9                 89            88
5    Ravi           5                 66            33
6    Xien           7                 49            90
7   Jalpa           8                 72            47

方法1

df2<-df1[!(df1$Name=="George" | df1$Name=="Andrea"),]

変数nameがGeorgeまたはAndreaの行の削除。

     Name Grade_score Mathematics1_score Science_score
3 Micheal           2                 44            45
4  Maggie           9                 89            88
5    Ravi           5                 66            33
6    Xien           7                 49            90
7   Jalpa           8                 72            47

subset() 関数で行を削除

df2<-subset(df1, Name!="George" & Name!="Andrea")

dplyrのslice()関数を使用し、ケース番号で削除

library(dplyr)
df1b<- cbind(ID = 1:nrow(df1), df1)
df3 <- df1b %>% slice(-c(2, 4, 6)) ## パイプ
df3 <- slice(df1b, -c(2, 4, 6)) ## オーソドックス

結果。

  ID    Name Grade_score Mathematics1_score Science_score
1  1  George           4                 45            56
2  3 Micheal           2                 44            45
3  5    Ravi           5                 66            33
4  7   Jalpa           8                 72            47

dplyrパッケージを使わない場合。

df4 <- df1b[-c(2, 4, 6), ]

dplyrパッケージ+演算子の場合。

library(dplyr)
df1c <- df1b
res01 <- df1c[!(row.names(df1c) %in% c('2','4','6')), ]
res01

欠損値を含む行の削除

サンプルデータの作成

df5 = data.frame(Name = c('George','Andrea', 'Micheal','Maggie','Ravi','Xien','Jalpa',''), 
                 Mathematics_score=c(45,78,44,89,66,NA,72,87),
                 Science_score=c(56,52,NA,88,33,90,47,76))
df5

データ。

     Name Mathematics_score Science_score
1  George                45            56
2  Andrea                78            52
3 Micheal                44            NA
4  Maggie                89            88
5    Ravi                66            33
6    Xien                NA            90
7   Jalpa                72            47
8                        87            76

na.omit()

df5_complete <- na.omit(df5)

結果。

    Name Mathematics_score Science_score
1 George                45            56
2 Andrea                78            52
4 Maggie                89            88
5   Ravi                66            33
7  Jalpa                72            47
8                       87            76

complete.cases()関数

res02 <- df5[complete.cases(df5),]
res02 

Nullと欠損値の両方を削除

df6 <- df5
res03 <- df6[!(is.na(df6$Name) | df6$Name=="" |
               is.na(df6$Science_score) | df6$Science_score==""|
               is.na(df6$Mathematics_score) | df6$Mathematics_score==""),] 

重複した行を削除

df7 <- data.frame (NAME =c ('Alisa','Bobby','jodha','jack','raghu','Cathrine',
                      'Alisa','Bobby','kumar','Alisa','jack','Cathrine'),
                      Age = c (26,24,26,22,23,24,26,24,22,26,22,25),
                      Score =c(85,63,55,74,31,77,85,63,42,85,74,78))

データ。

       NAME Age Score
1     Alisa  26    85
2     Bobby  24    63
3     jodha  26    55
4      jack  22    74
5     raghu  23    31
6  Cathrine  24    77
7     Alisa  26    85
8     Bobby  24    63
9     kumar  22    42
10    Alisa  26    85
11     jack  22    74
12 Cathrine  25    78

distinct()

distinct(df7)

重複行を削除。

      NAME Age Score
1    Alisa  26    85
2    Bobby  24    63
3    jodha  26    55
4     jack  22    74
5    raghu  23    31
6 Cathrine  24    77
7    kumar  22    42
8 Cathrine  25    78

unique()

unique(df7)

行番号のふるまい方がdistinct() とunique()は違っている。

       NAME Age Score
1     Alisa  26    85
2     Bobby  24    63
3     jodha  26    55
4      jack  22    74
5     raghu  23    31
6  Cathrine  24    77
9     kumar  22    42
12 Cathrine  25    78

duplicated()

NAME列の重複を削除。

df7[!duplicated(df7$NAME), ]

distinct() とunique()はすべての列が同一のものを削除するが、duplicated()のこのコードは特定の列の重複を削除する。