处理apply函数返回多个值时的NA值问题

4

我有一个包含两列col1col2的数据框df,其中包含NA值。我需要分别计算它们的平均数(mean)标准差(sd)。我已经使用以下代码分别计算了它们。

# Random generation
set.seed(12)
df <- data.frame(col1 = sample(1:100, 10, replace=FALSE), 
                 col2 = sample(1:100, 10, replace=FALSE))

# Introducing null values
df$col1[c(3,5,9)] <- NA
df$col2[c(3,6)] <- NA

# sapply with return a value for a function
stat <- data.frame(Mean=numeric(length = length(df)), row.names = colnames(df))
stat[,'Mean'] <- as.data.frame(sapply(df, mean, na.rm=TRUE))
stat[,'Sd'] <- as.data.frame(sapply(df, sd, na.rm=TRUE))

我尝试使用下面的代码同时执行这两个操作。

#sapply with return more than one value
stat[,c('Mean','Sd')] <- as.data.frame(t(sapply(c(1:length(df)),function(x)
    return(c(mean(df[,x]), sd(df[,x]))))))

由于我未能在最新的功能中删除NA值,因此我得到了meansdNA输出。

您能否提供有关如何删除每个函数meansdNA值的想法。此外,请建议任何其他可能的智能方法。


4
尝试运行此代码:vapply(df,function(x) c(mean(x,na.rm=TRUE),sd(x,na.rm=TRUE)),numeric(2))。该代码将计算数据框df中每列的均值和标准差,并返回一个由这些值组成的矩阵。 - nicola
@nicola 谢谢,它按照要求工作了。 - Prradep
1个回答

3

以下是一个选项:

funs <- list(sd=sd, mean=mean)
sapply(funs, function(x) sapply(df, x, na.rm=T))

生成:

           sd       mean    
col1.value 39.34826 39.42857
col2.value 28.33946 51.625  

如果您想在函数式库中进行精细操作:
sapply(funs, Curry(sapply, X=df), na.rm=T)

做同样的事情。


"funs <- data.frame(sd, mean)" 给我一个错误,"无法将类“function”强制转换为data.frame"。我需要加载任何软件包来克服这个错误吗? - Prradep
@Prradep 只需使用 list(sd=sd, mean=mean)。不确定为什么你会得到那个错误而我没有,可能是因为 R 版本的差异。 - BrodieG
是的,列表函数没有错误。我正在使用R版本3.1.2。这个问题在新版本中已经修复了吗? - Prradep
@Prradep 不知何故,加载 data.table 允许 data.frame 技巧起作用,不确定原因。如果我不加载 data.table,我可以复制您的失败。 - BrodieG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接