データフレームを作成しましたがmy.df
、いくつかの基準に基づいて行を選択(または行を削除)したいと思います。この例のデータフレームでは、行1、2、4、7、および8を保持します。具体的には、次のことを行います。
- 列3、4、または5に数値を含む行を保持します
- 列1と2が空白でなく、ジャンクが含まれていない場合は、行3〜5に欠落しているすべての観測値を含む行を保持します。
私はこれを行うことができますが、私の解決策は非常に複雑であるように思われ、誰かがより効率的なアプローチを提案することを望んでいます。
my.df <- data.frame(C1 = c("group1", "group1", "", "", "junk", "junk", "group2", ""),
C2 = c( "A", "B", "", "", "", "junk", "B", "C"),
C3 = c( 100, NA, NA, 10, NA, NA, NA, NA),
C4 = c( 200, NA, NA, 20, NA, NA, 100, NA),
C5 = c( 100, NA, NA, 30, NA, NA, NA, 5))
my.df
# the number of missing observations in columns 3-5 is < 3 or
# when the number of missing observations in columns 3-5 is 3 neither column 1 nor 2 is either blank or 'junk'
df.2 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) & my.df[,1] != 'junk' & my.df[,2] != 'junk' & my.df[,1] != '' & my.df[,2] != '') , ]
df.2
私の実際のデータでは、ジャンクと見なされるものは複雑になる可能性があります。したがって、ここで一般化junk
して、行1、2、4、7、および8を保持したいと思います。以下のコードは機能しますjunk1
。junk2
my.df <- data.frame(C1 = c("group1", "group1", "", "", "junk2", "junk1", "group2", ""),
C2 = c( "A", "B", "", "", "", "junk1", "B", "C"),
C3 = c( 100, NA, NA, 10, NA, NA, NA, NA),
C4 = c( 200, NA, NA, 20, NA, NA, 100, NA),
C5 = c( 100, NA, NA, 30, NA, NA, NA, 5))
my.df
df.3 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) &
my.df[,1] != 'junk1' & my.df[,2] != 'junk1' &
my.df[,1] != 'junk2' & my.df[,2] != 'junk2' &
my.df[,1] != '' & my.df[,2] != '')
, ]
df.3
ここでは、ジャンクと見なされる文字列が非常に多様で複雑になるため、%in%を使用してコードを少し単純化してジャンクをグループ化しようとしましたが、エラーが発生しました。
all.junk <- c("", "junk1", "junk2")
my.df.1 <- my.df[,1]
my.df.2 <- my.df[,2]
my.df.1 <- as.character(my.df.1)
my.df.2 <- as.character(my.df.2)
df.4 <- my.df[ (rowSums(is.na(my.df[,3:5])) < (ncol(my.df)-2)) |
(rowSums(is.na(my.df[,3:5])) == (ncol(my.df)-2) &
my.df.1[!(my.df.1%in%all.junk)] & my.df.2[!(my.df.2%in%all.junk)]) , ]
df.4
私が持っている関数型コードを続行して、df.3
ジャンクと見なされる文字列ごとに新しい行を追加することもできますが、はるかに効率的な解決策があると思います。
Stackoverflowで同様の質問を見つけましたが、この例のように多くの、または複雑な選択基準を扱っているように思われるものはありません。
提案をありがとうございますが、特にのエラーに関してdf.4
です。