2017-10-12 67 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) 
相关问题