【问题标题】:means and SD for columns in a dataframe with NA values数据框中具有 NA 值的列的均值和 SD
【发布时间】:2014-01-14 16:00:56
【问题描述】:

我正在尝试用NA 值计算data.frame 中几列(第一列除外)的平均值和标准差。

我尝试使用colMeanssapply 等方法创建一个循环,该循环贯穿 data.frame,然后将平均值和标准差存储在单独的表中,但不断收到“FUN”错误。任何帮助都会很棒。谢谢

一个

【问题讨论】:

  • 您可以发布您尝试过的代码吗?目前还不清楚你在哪里卡住了。
  • 一个“有趣”的错误不是一种有用的表达方式。可能有帮助的是错误消息的确切文本 - 不要假设没有人会理解它。

标签: r mean sapply standard-deviation


【解决方案1】:
sapply(df, function(cl) list(means=mean(cl,na.rm=TRUE), sds=sd(cl,na.rm=TRUE)))
      col1     col2     col3     col4     col5    
means 3        8        12.5     18.25    22.5    
sds   1.581139 1.581139 1.290994 1.707825 1.290994

as.data.frame( t(sapply(df, function(cl) list(means=mean(cl,na.rm=TRUE), 
                                              sds=sd(cl,na.rm=TRUE))) ))
     means      sds
col1     3 1.581139
col2     8 1.581139
col3  12.5 1.290994
col4 18.25 1.707825
col5  22.5 1.290994

【讨论】:

  • 最好用... 替换主要参数以提高清晰度:sapply(df, function(...) list(means=mean(..., na.rm=TRUE), sds=sd(..., na.rm=TRUE)))
  • 你觉得这样“更清楚”?我的看起来更具体,我认为会产生更多信息丰富的错误消息,我认为“更清楚”,但也许我错过了更深层次甚至更明显的东西?
  • 是的,我们没有修改的主要 arg(s) 的省略号的使用更加清楚,这是 R 中的约定。从略读中可以看出,它非常清楚地表明我们代码的重点是将非默认参数 na.rm=TRUE 添加到两个 fn 调用中。更强大的是,省略号可以代表多个参数。你的错误信息也不会更清楚。
  • 我对 R-dots(省略号)解析形式有点熟悉,但我错过了那个共识文件。如果链接,我会阅读材料。
  • 据我所知没有权威引用,但它在代码中非常普遍; Hadley 在他的包裹中经常使用它。这是one citation
【解决方案2】:

以下示例代码可能很有用。

# Create a 5 column dataframe that contains some NAs
col1 <- c(1,2,3,4,5)
col2 <- c(6,7,8,9,10)
col3 <- c(11,12,13,14,NA)
col4 <- c(16,NA,18,19,20)
col5 <- c(21,22,23,24,NA)
dataframe <- data.frame(col1,col2,col3,col4,col5)

# Apply the mean() function to all but the first column of the dataframe
apply(dataframe[,2:ncol(dataframe)], 2, function(x) mean(x, na.rm=TRUE))

# Check that the returned values are correct:
mean(col2)
mean(col3, na.rm=TRUE)
mean(col4, na.rm=TRUE)
mean(col5, na.rm=TRUE)

对于标准差,将mean() 替换为sd()

【讨论】:

    【解决方案3】:

    你应该使用的函数(例如colMeans)几乎都有一个名为na.rm的参数,默认为FALSE。只需执行colMeans(x = your_df, na.rm = TRUE) 就可以了。如果您想逐列访问,则与仅使用 mean() 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2021-04-16
      • 2018-06-23
      • 2019-12-15
      • 2013-09-25
      • 1970-01-01
      • 2020-02-09
      相关资源
      最近更新 更多