2016-10-13 13 views
0

繰り返し処理を行う場合、私は犬がAにおける機能の名前である場合は因子レベルの頻度が10以上サブセットは、データフレーム

ある私のデータフレームのサブセットをしようとしている特異なケースでの作業ではなく、データフレーム:

は動作しません:

somevar <- "dogs" 
df <- subset(df, with(df, somevar %in% names(which(table(somevar)>=10)))) 

戻り値0観測

とDFが作業を行います。

df <- subset(df, with(df, dogs %in% names(which(table(dogs)>=10)))) 

その周波数が10未満ですと犬のレベルが違いは何

を削除されているところ、これら以来、数より少ない行を持つDF戻り、なぜ第二1つの作業が、以前のものはないでしょうか?

データフレーム内のフィーチャーをループする必要があるので、私は動作しない方法が必要です!私は、forループに

再現例機能名のベクトルを渡したい:

vegetables <- c("carrots", "carrots", "carrots", "carrots", "carrots") 
animals <- c("cats", "dogs", "dogs", "fish", "cats") 
df <- data.frame(vegetables, animals) 
df 
    vegatables animals 
1 carrots cats 
2 carrots dogs 
3 carrots dogs 
4 carrots fish 
5 carrots cats 
> str(df) 
'data.frame': 5 obs. of 2 variables: 
$ vegatables: Factor w/ 1 level "carrots": 1 1 1 1 1 
$ animals : Factor w/ 3 levels "cats","dogs",..: 1 2 2 3 1 

私は彼らがこの場合の周波数では因子機能の観測周波数2未満を持っている任意の観測を削除したいです動物の因子内のレベルの魚は1であるので、私はdfが1つの観察によって減少することを期待している:

> test <- subset(df, with(df, animals %in% names(which(table(animals) >= 2)))) 
> test 
    vegatables animals 
1 carrots cats 
2 carrots dogs 
3 carrots dogs 
5 carrots cats 

グレート。

categoricals <- names(df) 

for (i in categoricals) { 
    test <- subset(df, with(df, i %in% names(which(table(i) >= 10)))) 
} 

は、空のデータフレームDFを返します:私はこれを行う際に、それを除いて

は動作しません。私はそれが上記のテストdfとまったく同じに戻ると思った。

類似:

i <- "animals" 
test <- subset(df, with(df, i %in% names(which(table(i) >= 2)))) 
> test 
[1] vegatables animals 
<0 rows> (or 0-length row.names) 

私は私が直接機能付きに動物を入力したときと同じように動作する最後の例を期待。

+0

問題は、あなたのループ内で 'df'を上書きするということです。したがって、2回目の反復では、 'df'はすでに空になっています。 結果を他の変数に格納することが解決策になります。 –

+0

こんにちは@BenjaminMohn、私は質問に多くを追加しました。それはforループでさえありません。上記の「動作しない/動作しない」を参照してください。 –

+0

'dogs!=" dogs "' – Hugh

答えて

1

このアプローチは行を削除することを、注意してください。いずれかの要因が希望のしきい値を下回るとすぐに、両方の列から選択します。

vegetables <- c("carrots", "carrots", "carrots", "carrots", "carrots","onion","onion") 
animals <- c("cats", "dogs", "dogs", "fish", "cats", "mice","cows") 
df <- data.frame(vegetables, animals) 

categoricals <- names(df) 

for (i in categoricals) 
{ 
    test <- df[df[,i] %in% names(which(table(df[,i]) >= 2)),] 
} 
test 
    vegetables animals 
1 carrots cats 
2 carrots dogs 
3 carrots dogs 
5 carrots cats 
+0

ありがとうございます。なぜ私は好奇心からdf [、i]を使わなければならなかったのですか? –

+1

Rの中のものを抽出することは、インデックスの周りに構築されます。 df [、i]はこの索引付け機能を利用します。 df $ vegetablesまたはsubset(...)は基本的には同じですが、インタラクティブな使用のためのもので、他のアプリケーションでは異常終了したり異常な動作を引き起こします。 – Smundo

0

あなたは、動物あたりの観測数を持つ新しいデータフレームを作成し、元にそのデータをマージし、その後、通常の方法でサブセットする必要があります

vegetables <- c("carrots", "carrots", "carrots", "carrots", "carrots") 
animals <- c("cats", "dogs", "dogs", "fish", "cats") 
df <- data.frame(vegetables, animals) 

library(dplyr) 
n_animals <- count(df, animals) 

merge(df, n_animals, by = "animals") %>% 
    filter(n >= 2) 

# animals vegetables n 
# 1 cats carrots 2 
# 2 cats carrots 2 
# 3 dogs carrots 2 
# 4 dogs carrots 2 
+0

ありがとうヒューですが、私は以前と同じ問題にぶつかっています。特定の機能名で1回だけサブセット化することができます。しかし、ループの中で一連の機能を実行したときにはそうではありません。 野菜< - c( "carrots"、 "carrots"、 "carrots"、 "carrots"、 "carrots") < "犬"、 "犬"、 "魚"、 "猫") DF < - data.frame(野菜、動物) ライブラリ(dplyr) 偉業< - 名(DF)のための (I偉業で) 'count_'を試して、NSEのドキュメントも見直してください。{n_animals < - count(df、i) merge(df、n_animals、by = i)%>% フィルタ(n> = 2) –

+0

'vignette(" nse ")' – Hugh

+0

引用符 ""をつけてもcount_()は成功しませんでした。私はこれについての最初の試みでもdplyrとのこの問題を抱えていました。 –

関連する問題