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
一応、できました。
でも、もっといいやり方があるような気がします・・・
# サンプルデータの作成
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
一応、できました。
でも、もっといいやり方があるような気がします・・・
コメント
コメントを投稿