用NA替换特定范围的数字

问题描述

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

> V1 <- c(23,2,4)
> V2 <- c(7,9)
> V3 <- c(23,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

解决方法

我们可以使用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] <= 20],na.rm = TRUE)
#[1] 3
,

Base R解决方案:

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

也许试试看:

library(dplyr)
#Code
mat <- matrix(c(23,2,4,7,9,23,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