2017-05-19 12 views
1

私は、野生の動物の観察(記録日時、場所、種の識別)を含むデータフレーム(R)を扱っています。特定の種が含まれている行を、データフレーム全体でx個以下の観測値がある場合は削除したいと考えています。今のところ、私は次のコードで動作させることができましたが、よりエレガントで効率的な方法が必要であることがわかりました。変数の頻度に基づいてデータフレームの行を削除する

namelist <- names(table(ind.data$Species)) 
for (i in 1:length(namelist)) { 
    if (table(ind.data$Species)[namelist[i]] <= 2) { 
    while (namelist[i] %in% ind.data$Species) { 
     j <- match(namelist[i], ind.data$Species) 
     ind.data <- ind.data[-j,] 
    } 
    } 
} 

namelistベクターは、リスト上の名前番目iの周波数をx(この例では2)未満であるかどうかを確認するために、データフレームind.data、及びifステートメントチェック内のすべての種名を含みます。

これは非常にクリーンな方法ではないことを十分に認識しており、昨日の終わりにそれを一緒に投げて機能するかどうかを確認しました。今私はそれを行うためのよりよい方法を探しています。

答えて

0

私たちは、私がdata.table

library(data.table) 
setDT(ind.data)[, .SD[.N >2], Species] 
+1

これは完全に働いた、ありがとう!また、大規模なデータセットでは、特に以前からの私のハックな 'for'ループと比べて、かなり高速です。 – twieg

+0

@twiegはい、data.tableは非常に高速です – akrun

1

あなたはdplyrパッケージでこれを行うことができます。

library(dplyr) 

new.ind.data <- ind.data %>% 
    group_by(Species) %>% 
    filter(n() > 2) %>% 
    ungroup() 

組み込み関数を使用して代替ave()を使用することです:

group_sizes <- ave(ind.data$Species, ind.data$Species, FUN = length) 
new.ind.data <- ind.data[group_sizes > 2, ] 
+0

を使用することができます(ave()を使って)2番目のアプローチを試みましたが、moを持ついくつかのグループを削除しましたそれは、それぞれ12,1,2,17,2,2,110の観測値を有するグループを除去した。なぜどんなアイデア? 私は20の種族から始めましたが、私は16で終わっていなければならないときに13で終わった。 – twieg

関連する問題