【问题标题】:replace specific range of numbers with NA用 NA 替换特定范围的数字
【发布时间】:2021-01-02 17:13:26
【问题描述】:

我正在处理一个数据框,该数据框的一列中有一些不可接受的数字。我想知道如何用 R 中的 NA 值替换特定范围内的数字? 比如

> V1 <- c(23,2,4)
> V2 <- c(7,2,9)
> V3 <- c(23,2,9)
> df <- data.frame(V1, V2, V3)
    
           V1   V2   V3
    [1,]   23    7   23
    [2,]    2    2    2
    [3,]    4    9    9

在这个数据框中,首先我想将第 1 列中超过 20 的所有数字更改为 NA(因为超过 20 的数字对于我拥有的数据不现实),然后取该列的平均值。

所以结果数据框将是:

       V1   V2   V3
[1,]   NA    7   23
[2,]    2    2    2
[3,]    4    9    9

第一列的平均值为 (2+4)/2=3

【问题讨论】:

  • 你需要mat[,1][mat[,1] &gt; 20] &lt;- NA,然后是mean(na.omit(mat[,1]))
  • 我正在处理一个数据框,有什么方法可以做你提到的数据框吗?
  • 是的,该代码也适用于 data.frame 列

标签: r dataframe mean na


【解决方案1】:

我们可以使用base R 来执行此操作。将第一列大于20的元素替换为NA,得到mean

df[,1][df[,1] > 20] <- NA 
mean(df[,1], na.rm = TRUE)
#[1] 3

对于所有其他列

colMeans(df, na.rm = TRUE)
#     V1       V2       V3 
#3.00000  6.00000 11.33333 

或者单行

mean(df[,1][df[,1] <= 20], na.rm = TRUE)
#[1] 3

【讨论】:

    【解决方案2】:

    基础 R 解决方案:

    colMeans(within(df, {V1 <- replace(V1, V1 > 20, NA_integer_)}), na.rm = TRUE)
    

    【讨论】:

      【解决方案3】:

      不妨试试这个:

      library(dplyr)
      #Code
      mat <- matrix(c(23,2,4,7,2,9,23,2,9), ncol = 3)
      mat <- as.data.frame(mat)
      #Solution for replace
      mat %>% mutate(V1=ifelse(V1>20,NA,V1)) %>%
        colMeans(.,na.rm=T)
      

      输出:

            V1       V2       V3 
       3.00000  6.00000 11.33333 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2023-04-05
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多