2016-07-28 97 views
-2

對於數據框中的一系列列(變量),我需要爲每個變量的每個級別生成表。我創建了一個函數來查找範圍(Q1a)中的第一列,然後爲每個列之後的循環運行for循環。循環查找每列中的級別數量,然後第二個for循環應該生成表格並將其保存爲具有唯一文件名的.csv。在一列的範圍內爲每個因子級別生成表,在R中用dplyr和reshape2

實施例的數據幀:

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返回:

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

這裏是我寫的函數:

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 Female Male Total 
1   A   366 259  625 
2   B   30  35  65 
3   C   83  61  144 
4   D   55  58  113 

我可以用幾行代碼正確地生成一個像上面那樣的表格。問題是該函數不會生成任何文件。我在正確的軌道上嗎?有沒有更簡單的方法來使用apply?

+0

請包括您的預期輸出。從你的帖子中不清楚。 – lmo

+1

您錯過了'write.csv'上的右括號。 – aosmith

+0

這不是,IMO,對於SO來說是一個合適的問題。基本問題,如確保括號全部關閉,應在發佈問題前修復。 – dayne

回答

0

我改變了一些問題。看看你的循環中i的價值。它是來自df的列名稱的字符串值。當傳遞給levels()時,你所得到的全部是NULL。如果您確實想要使用levels(),則需要將這些列轉換爲因子,否則請替換unique()

請參閱使用此功能?subset下的警告部分,我已經改變使用[的子集劃分的數據幀中的代碼。

此外,我認爲你的意思是輸出table到CSV而不是org.sum,這在你的例子中不存在。

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

在解決方案中使用unique()而不是levels()可以很好地工作。你的子集調整絕對是缺失的一塊。是的,org.sum是一個錯字。感謝您的有益迴應!乾杯。 –

相關問題