2016-07-28 7 views
-2

データフレーム内のある範囲の列(変数)に対して、各変数の各レベルの表を生成する必要があります。私は範囲(Q1a)の最初の列を見つけて、その後すべての列のforループを実行する関数を作成しました。ループは各列のレベル数を見つけ、次に2番目のforループはテーブルを生成し、それを一意のファイル名で.csvとして保存することになっています。dplyrとreshape2を使用してRの範囲で各因子レベルの表を生成

例のデータフレーム:

df <- data.frame(Organization = c("A", "B", "C", "D"), Gender = c("Male", "Female", "Male", "Female"), Q1a = c(1, 2, 3, 4), Q1b = c(1, 2, 1, 2)) 

DF戻り値:

library(dplyr) 
library(reshape2) 
f = function(df) { 
    a <- which(colnames(df) == "Q1a") 
    for(i in colnames(df[, a:length(df)])) { 
     levelsList <- as.list(levels(i)) 
     for(j in levelsList) { 
      temp <- subset(df, i == j, select = c(Organization, Gender, i)) 
      temp <- group_by(temp, Organization, Gender) 
      table <- summarize(temp, count = n()) 
      table <- dcast(table, Organization ~ Gender) 
      table <- mutate(table, Total = Female + Male) 
      write.csv(table, paste0(i, "_", j, ".csv")) 
     } 
    } 
} 

ようになり、より大きなデータセットに対する期待出力:ここ

Organization Gender Q1a Q1b 
1   A Male 1 1 
2   B Female 2 2 
3   C Male 3 1 
4   D Female 4 2 

は、私が書いた関数です。

Organization Female Male Total 
1   A   366 259  625 
2   B   30  35  65 
3   C   83  61  144 
4   D   55  58  113 

上記のような1つのテーブルを、数行のコードで正しく生成することができます。問題は、関数がファイルを生成しないことです。正しい軌道にいるのですか?適用を使用してこれを行う簡単な方法はありますか?

+0

予想される出力を含めてください。あなたのポストからは分かりません。 – lmo

+1

'write.csv'に閉じ括弧がありません。 – aosmith

+0

これは、IMOではないので、適切な質問です。括弧がすべて閉じていることを確認するなどの基本的な問題は、質問を投稿する前に修正する必要があります。 – dayne

答えて

0

私が変更したいくつかの問題。 iの値があなたのループ内にあることを見てください。列名の文字列値はdfです。 levels()に渡されると、これまでに得られるのはNULLです。 levels()を実際に使用する場合は、これらの列を要因に変換する必要があります。そうでない場合は、unique()を代入する必要があります。

この機能を使用するには、?subsetの警告セクションを参照してください。データフレームをサブセット化するためにコードを[に変更しました。

また、あなたの例には存在しないorg.sumではなく、tableをCSVに出力することを前提としていました。

library(dplyr) 
library(reshape2) 

df <- data.frame(Organization = c("A", "A", "B", "C", "D"), Gender = c("Male", "Female", "Female", "Male", "Female"), Q1a = as.factor(c(1, 1, 2, 3, 4)), Q1b = as.factor(c(1, 1, 2, 1, 2))) 
f = function(df) { 
    a <- which(colnames(df) == "Q1a") 
    for(i in colnames(df[, a:length(df)])) { 
    levelsList <- levels(df[,i]) 
    for(j in levelsList) { 
     temp <- df[df[,i] == j, c('Organization', 'Gender', i)] 
     temp <- group_by(temp, Organization, Gender) 
     table <- summarize(temp, count = n()) 
     table <- dcast(table, Organization ~ Gender, value.var='count') 
     if (dim(table)[2] > 2) {table$Total <- rowSums(table[,c('Male', 'Female')])} 
     else {table$Total <- table[,2]} 
     write.csv(table, paste0(i, "_", j, ".csv"), row.names = F) 
    } 
    } 
} 

f(df) 
+0

解決策では、levels()の代わりにunique()を使用すると美しく機能しました。あなたのサブセッティングの調整は間違いなく欠けていました。そしてはい、org.sumはタイプミスです。役に立った返信ありがとう!乾杯。 –

関連する問題