2015-07-01 86 views
0

我尋覓了幾個選項,通常嘗試各種組合上cbind做到這一點。基本上我想創建一個數據框,它結合了不同的數據透視表。整合到一個數據框中以便導出到csv/excel。有沒有更好的方法來完成這一點?表綁定到一個數據幀

編輯:從本質上講,我想學習創建一個可環繞多個不同的數據透視表創建準備出口,將作爲模板來即席報表數據幀的功能的基礎知識。我遇到的問題是cbind產品需要使用對象B,它作爲獨立單元將是一個以日期爲列的表格,並將其強制爲一個長表格,其中日期轉換爲行。

數據框:

State FacilityName Date 
NY Loew    June 2014 
NY Loew    June 2014 
CA Sunrise   May 2014 
CA     May 2014 

代碼:

+0

您能提供一個可重複的例子嗎? –

+0

而你的問題是什麼都沒有返回?如果是這種情況,您需要在'volume'函數的最後一行使用'return(x)'。如果你的問題是在運行該函數後找不到'x',那麼你需要''將''x'分配給全局環境,這不是推薦的編碼習慣。另外,根據你的代碼,你所要做的並不需要函數。你正在編寫兩個沒有輸入的函數,只能用來濫用R的不合邏輯/後向範圍規則。 – Vlo

+0

您沒有足夠的右括號 –

回答

0

好了,看來我試圖冷靜和使用功能的希望來包裝的一切,這將是年初學習編寫靈活的代碼。但是,我做了很長的一段路,最終取得了我想要的結果。儘管我將發佈以下工作的代碼,但我對有人指責我採取更好的方法來解決這些問題非常感興趣,以便學習更好的代碼。

# Label the empty cells as Missing 
ec$missing = ifelse(is.na(ec$FacilityName), "Missing", ec$FacilityName) 
# Subset the dataframe to just missing values  
df = subset(ec, ec$missing == "Missing") 
# Create table that is a row of frequency by month for missing values 
a <- table(df$missing, df$date) 

# Reload dataframe to exclude Missing values 
df = subset(ec, ec$missing != "Missing") 
# Create table that shows frequency of observations for each facility by Month 
b <- table(df$FacilityName, df$date) 

# Create a Total row that can go at the bottom of the final data frame 
Total <- nrow(ec) 

# Bind all three objects 
rbind(a,b,Total) 

這是我一直在尋找最終產品的例子:

  May2014 June2014 
Missing  2  0 
Sunrise  0  0 
Loew   1  2 
Total   3  2 
1

當你給表函數的一個因素,它使用係數的水平,建表。因此,通過在「FacilityName」的級別添加「Missing」可以獲得您想要的結果。

# loading data 
ec <- read.csv(text= 
'State, FacilityName, Date 
NY,Loew,June 2014 
NY,Loew,June 2014 
CA,Sunrise,May 2014 
CA,NA,May 2014',) 

# Adding Missing to the possible levels of FacilityName 
# note that we add it in front 
new.levels <- c("Missing", levels(ec$FacilityName)) 
ec$FacilityName <- factor(ec$FacilityName, levels=new.levels) 

# And replacing NAs by the new level "Missing" 
ec$FacilityName[is.na(ec$FacilityName)] <- "Missing" 
# the previous line would not have worked 
# if we had not added "Missing" explicitly to the levels 


# table() uses the levels to generate the table 
# the levels are displayed in order 
# now there's a level "Missing" in first position 
t <- table(ec$FacilityName, ec$Date) 

你得到:

> t 
      June 2014 May 2014 
    Missing   0   1 
    Loew    2   0 
    Sunrise   0   1 

您可以添加這樣的行總(我不認爲有nrow你的代碼你說什麼它)

# adding total line 
rbind(t, TOTAL=colSums(as.matrix(t))) 

      June 2014 May 2014 
Missing   0   1 
Loew    2   0 
Sunrise   0   1 
TOTAL    2   2 

在這一點你有一個矩陣,所以你可能想要傳遞給as.data.frame

如果你願意,這可以很容易地實現到一個單獨的功能。完全不需要綁定多個表:)

+0

這真的很棒。感謝幫助徹底打破了我。 – Jebediah15

+0

這真的很棒。感謝幫助徹底打破了我。我遇到的一個問題是,第二行,添加因子轉換隻捕捉「​​失蹤」,而不是FacilityName – Jebediah15

+0

我不確定你的意思。檢查'new.levels'是否包含您期望的內容。我認爲FacilityName已經是一個因素,因此需要「添加」一個新的水平。如果它不是一個因素(例如它是一個字符向量),那麼使用'levels()'就沒有意義。在這種情況下,您可以使用'new.levels < - c(「Missing」,unique(ec $ FacilityName))''來構建'new.levels'。希望能幫助到你。 –