在R语言data_summary函数中添加案例数统计列报错的解决方法
问题描述
需要计算由两个变量定义的子类的标准差(SD)、均值以及各类别的案例数,参考原有R代码修改后报错“参数过多”,相关代码如下:
原有可运行代码
data_summary <- function(data, varname, groupnames){ require(plyr) summary_func <- function(x, col){ c(mean = mean(x[[col]], na.rm=TRUE), sd = sd(x[[col]], na.rm=TRUE)) } data_sum<-ddply(data, groupnames, .fun=summary_func, varname) data_sum <- rename(data_sum, c("mean" = varname)) return(data_sum) }
修改后报错的代码
data_summary <- function(data, varname, groupnames){ require(plyr) summary_func <- function(x, col){ c(mean = mean(x[[col]], na.rm=TRUE), sd = sd(x[[col]], na.rm=TRUE), n = length(x[[col]], na.rm=TRUE)) # 新增的案例数计算 } data_sum<-ddply(data, groupnames, .fun=summary_func, varname) data_sum <- rename(data_sum, c("mean" = varname)) return(data_sum) }
解决方法
报错原因是length()函数没有na.rm参数,多传参数导致报错。正确计算非缺失值案例数的方法如下:
方式一:直接修正案例数计算逻辑
修改summary_func中的案例数统计代码,用sum(!is.na(x[[col]]))统计非缺失值数量:
data_summary <- function(data, varname, groupnames){ require(plyr) summary_func <- function(x, col){ c(mean = mean(x[[col]], na.rm=TRUE), sd = sd(x[[col]], na.rm=TRUE), n = sum(!is.na(x[[col]])) # 正确计算有效案例数 ) } data_sum <- ddply(data, groupnames, .fun=summary_func, varname) data_sum <- rename(data_sum, c("mean" = varname)) return(data_sum) }
方式二:拆分统计再合并(可读性更强)
先分别计算分组的统计量和案例数,再合并结果:
data_summary <- function(data, varname, groupnames){ require(plyr) # 计算均值与标准差 stats_df <- ddply(data, groupnames, function(x, col){ c(mean = mean(x[[col]], na.rm=TRUE), sd = sd(x[[col]], na.rm=TRUE)) }, varname) # 计算分组案例数 count_df <- ddply(data, groupnames, summarise, n = sum(!is.na(get(varname)))) # 合并结果 data_sum <- merge(stats_df, count_df, by = groupnames) data_sum <- rename(data_sum, c("mean" = varname)) return(data_sum) }
内容的提问来源于stack exchange,提问作者KMatsuda
相关产品推荐
相关产品推荐

