分享
三行代码  ›  专栏  ›  技术社区  ›  Roozbeh Yousefnejad

用NA替换特定的数字范围

  •  1
  • Roozbeh Yousefnejad  · 技术社区  · 1 周前

    例如

    > 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

    2 回复  |  直到 1 周前
        1
  •  1
  •   akrun    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
  •  0
  •   Duck    1 周前

    也许可以试试这个:

    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 
    
        3
  •  0
  •   hello_friend    1 周前

    基础R溶液:

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