Rのデータフレームから少数の行を削除する

例えば、↓こんなデータがあったとして、

# サンプルデータの作成
name  <- c("Anne", "Bob", "Carl", "Dann", "Eric", "Fred")
fruits <- c("orange", "apple", "orange", "durian", "orange", "apple")
df <- data.frame(name, fruits)

df # 中身を見てみる


  name fruits
1 Anne orange
2  Bob  apple
3 Carl orange
4 Dann durian
5 Eric orange
6 Fred  apple


みんなの好きな果物のデータだとして、1人しかいないような少数派の行は除去したいと。この例だと、ダンのドリアンを取り除きたいと。

ddplyを使って度数をカウントし、新たに度数(count)の列として追加(transform)。

library(plyr)
ddply(df, "fruits", transform, count=length(fruits))


  name fruits count
1  Bob  apple     2
2 Fred  apple     2
3 Dann durian     1
4 Anne orange     3
5 Carl orange     3
6 Eric orange     3


で、このcount列を条件として、データフレームをフィルタすればいいかなと。

dd <- ddply(df, "fruits", transform, count=length(fruits))
dd[ dd$count > 1, ] # 少数派の行を削除


  name fruits count
1  Bob  apple     2
2 Fred  apple     2
4 Anne orange     3
5 Carl orange     3
6 Eric orange     3


count列が邪魔だったら、後から削除しよう。

dd2 <- dd[ dd$count > 1, ]      # 少数派の行を削除
dd2[, colnames(dd2) != "count"] # countの列を削除


  name fruits
1  Bob  apple
2 Fred  apple
4 Anne orange
5 Carl orange
6 Eric orange

一応、できました。

でも、もっといいやり方があるような気がします・・・

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法