处理应用函数中的NA值,返回多个值

时间:2015-06-10 13:37:58

标签: r dataframe sapply

我的数据框df包含两列col1col2,其中包含NA个值。我必须为他们计算meansd。我用下面的代码单独计算了它们。

# 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值,因此NAmean的输出为sd

您能否就如何删除每个函数NAmean的{​​{1}}值进行说明。此外,请建议任何其他可能的聪明方法。

1 个答案:

答案 0 :(得分: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  

如果你想对functional库变得可爱:

sapply(funs, Curry(sapply, X=df), na.rm=T)

做同样的事情。