【问题标题】:Ignoring NA in R across multiple columns of Datafrme using na.omit or NA.RM and mapply使用 na.omit r NA.RM 和 lapply 在 Dataframe 的多列中忽略 R 中的 NA
【发布时间】:2020-12-29 15:26:59
【问题描述】:

我有一个看起来像这样的数据框:

 SampleNo Lab1  Lab2  Lab3 lab4    lab5    lab6    lab7   lab8    lab9   lab10 
1  59.84    60.59   60.39   60.29   60.19   60.32   60.24   60.3    60.43   NA
2  59.78    60.19   60.16   60.23   60.32   60.46   60.53   60.2    60.40   59.6
3  59.86    60.17   60.22   60.28   60.18   60.42   60.21   60.0    60.44   NA 
4  59.85    60.42   60.28   60.31   60.19   60.41   60.54   60.2    60.48  59.7 
5  59.97    60.79   60.30   60.26   60.40   60.47   60.52   60.0    60.46   59.7
6  60.03    60.26   60.36   60.21   60.32   60.46   60.50   60.1    60.29   60.0

我想对数据框中每一列的平方求和,同时忽略 NA 值并分配给一个新向量。我可以让代码为 1 列工作,但我想使用 mapply 函数或类似的函数来同时获取所有列的值并分配给一个新向量。

我有以下单列代码

myvector <- sum(na.omit(df[,2] - mean(df[,2))^2)) 这适用于 1 列

我已经为整个数据框尝试了以下方法

myvector <- (mapply(na.omit(sum(df[,2:11] - mean(df[,2:11]))^2)))

我收到错误消息“match.fun(FUN) 中的错误:c(""na.omit(sum(df[,2:11] - mean(df[, is not a function, character or symbol", 2:11]))^2 不是函数字符或符号

myvector <- (mapply(sum(na.omit(df[,2:11] - mean(df[,2:11]))^2)))

但得到这个错误:

sum(na.omit, df[, 2:11] - mean(df[, : 参数的无效“类型”(闭包) 另外:警告信息: 在 mean.default(df[, 2:11]) 中: 参数不是数字或逻辑:返回 NA

我的想法是 na.omit 在错误的地方,但我不知道它应该去哪里。

【问题讨论】:

    标签: r na mapply


    【解决方案1】:

    您可以转置数据,减去列均值,然后计算平方和。

    rowSums((t(df[-1]) - colMeans(df[-1], na.rm = TRUE))^2, na.rm = TRUE)
    

    此外,您可以将每列的样本方差乘以非缺失值的相应长度减1,得到平方差之和。

    sapply(df[-1], var, na.rm = TRUE) * (colSums(!is.na(df[-1])) - 1)
    
    # Lab1  Lab2  Lab3  lab4  lab5  lab6  lab7  lab8  lab9 lab10 
    # 0.04  0.31  0.04  0.01  0.04  0.02  0.12  0.07  0.02  0.09
    

    公式:

    【讨论】:

      【解决方案2】:

      如果您想明智地执行操作列,可以使用sapply 执行此操作。

      sapply(df[-1], function(x) sum((x - mean(x, na.rm = TRUE))^2, na.rm = TRUE))
      

      或者将colSumscolMeanssweep 一起使用:

      colSums(sweep(df[-1], 2, colMeans(df[-1], na.rm = TRUE)) ^ 2, na.rm = TRUE)
      
      # Lab1  Lab2  Lab3  lab4  lab5  lab6  lab7  lab8  lab9 lab10 
      # 0.04  0.31  0.04  0.01  0.04  0.02  0.12  0.07  0.02  0.09 
      

      请注意,您可以使用 na.rm = TRUE 忽略 NA 值。

      数据

      df <- structure(list(SampleNo = 1:6, Lab1 = c(59.84, 59.78, 59.86, 
      59.85, 59.97, 60.03), Lab2 = c(60.59, 60.19, 60.17, 60.42, 60.79, 
      60.26), Lab3 = c(60.39, 60.16, 60.22, 60.28, 60.3, 60.36), lab4 = c(60.29, 
      60.23, 60.28, 60.31, 60.26, 60.21), lab5 = c(60.19, 60.32, 60.18, 
      60.19, 60.4, 60.32), lab6 = c(60.32, 60.46, 60.42, 60.41, 60.47, 
      60.46), lab7 = c(60.24, 60.53, 60.21, 60.54, 60.52, 60.5), lab8 = c(60.3, 
      60.2, 60, 60.2, 60, 60.1), lab9 = c(60.43, 60.4, 60.44, 60.48, 
      60.46, 60.29), lab10 = c(NA, 59.6, NA, 59.7, 59.7, 60)), 
      class = "data.frame", row.names = c(NA, -6L))
      

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多