2016-12-22 16 views
2

データフレーム内の各列の単方向頻度テーブル(各列の各固有値の数)を取得します。私はthis tutorialに従っています。これはplyrパッケージのcount()関数を使うことを示唆しています。freq()は、印刷時に列の名前を変更します。

for (col in mtcars[c("gear","carb")]){ 
freq <- count(col) 
write.table(freq, file='filename.txt') 
} 

私は、出力は次のようになりことを期待する:

gear freq 
1 3  15 
2 4  12 
3 5  5 

代わりに列名が 'X' に置き換えられます。

x freq 
1 3 15 
2 4 12 
3 5 5 

なぜこの出来事があり、どのようにすることができますforループを変更して、 'x'の代わりに列名を出力するようにしましたか?

は(おそらくforループを使用するよりも、この他を行うには良い、ベクトル化方法はありますが、私はRに新たなんだと、かなりの構文を把握することはできません。)

+0

'count'機能からですか?また、ループ内の 'col'の値について考えてみましょう。それはベクターですか?それはdata.frameですか?名前はありますか? – Axeman

答えて

2

forループでは: lapply()使用

for (col in c("gear","carb")){ 
    print(plyr::count(mtcars, col)) 
} 

:明確にするため

lapply(c("gear","carb"), function(col) plyr::count(mtcars, col)) 

を、countは何の名前を変更されていません。あなたのループでは、それはベクトルであるcolを受け取ります。ベクトルには列名がないため、countはどの名前を使用すべきかわかりません。これは、プレースホルダとしてxを使用します。

1

また、これは、(データフレームのリストとして結果を、入力としてデータセットmtcarの列の名前で)動作します:

lapply(c("gear","carb"), function(x){df <- as.data.frame(table(mtcars[x])); names(df) <- c(x, 'freq'); df}) 

[[1]] 
    gear freq 
1 3 15 
2 4 12 
3 5 5 

[[2]] 
    carb freq 
1 1 7 
2 2 10 
3 3 3 
4 4 10 
5 6 1 
6 8 1 
関連する問題