2017-10-12 83 views
0

我正在爲大量數據組做一些相當基本的描述性統計。我寫了一個函數來嘗試獲取我需要的統計信息。在數據框中創建一個新行,其中一個元素是一個因子,另一個數字

我想在數據框的底部創建一個新行,其中一個元素是一個因子(「總數」),另一個元素是數字(其他行的總和)。

下面是該代碼的一個例子:

創建數據框

df <- data.frame(
pop = c(201:250), 
age = factor(rep(c("20-29", "30-39", "40-49", "50-59", "60-69"), 10)), 
year = factor(rep(c(2012, 2013, 2014, 2015, 2016), 10))) 

寫一個函數來做到聚集

DiabMort_fun <- function(VDRpop, VDRage, nyrs, nrows) { 
Aggregate_fun <- function(pop, ag1, nyrs, nrows, names_list) { 
popbylist <- data.frame(aggregate(pop, by = list(Category = ag1), FUN=sum)) 
popbylist$mean <- (popbylist$x/nyrs) 
colnames(popbylist) = names_list 
popbylist[nrows,] <- c("total", sum(popbylist[2]), sum(popbylist[3])) 
return(popbylist) 
} 


VDRbyage <- Aggregate_fun(pop = VDRpop, ag1 = VDRage, nyrs = nyrs, nrows = nrows, 
         names_list = c("Age", "Num_pop_VDR", "Mean_pop_VDR")) 
return(VDRbyage) 
} 

運行該功能

test <- DiabMort_fun(VDRpop = df$pop, df$age, 
       nyrs = 5, nrows = 5) 

當我r未此,我得到以下錯誤消息:

警告消息: 在[<-.factor*tmp*,ISEQ,值= 「總」): 無效因子水平,NA產生

的「總計「現在列C(NA,11275,2255)

我想什麼它是爲C(」總」,11275,2255)

有誰知道如何在這個有趣的創建一個新的行這將擴大因素水平以包括「全部」?該函數中的相關代碼:

popbylist[nrows,] <- c("total", sum(popbylist[2]), sum(popbylist[3])) 

感謝

+0

這聽起來你正在努力使R工作像Excel電子表格,這顯然是不適當的。 – jsb

+0

您不能在data.frame的底部輸入類似的總數。您應該計算從data.frame中分離出的總數。對象類型是按變量(列)定義的,而不是按行定義的。 – jsb

回答

1

你不應該需要進行年齡和年份列因素;如果您跳過該步驟,並在第一個data.frame()調用中設置stringsToFactors = FALSE,則您的函數應該可以工作。

如果您確實想保留當前的訂單和數據類型,您可以將彙總行轉換爲1行數據框,然後將其綁定到其他框架。只要確保列名匹配:

temp <- data.frame("total", sum(popbylist[2]), sum(popbylist[3])) 
colnames(temp) = names_list 
popbylist <- rbind(popbylist, temp) 
相關問題