使用 R 将选定列的负值替换为 0 或 NA

Replace selected columns' negative values with 0s or NAs using R

对于示例数据 df,我想用 0 和第三列 (x3) 替换第一列 (x1) 中的负值NA 通过函数 replace_negatives 如下:

df  <- data.frame(x1 = -3:1,      
                    x2 = -1,
                    x3 = -2:2)
df 

输出:

  x1 x2 x3
1 -3 -1 -2
2 -2 -1 -1
3 -1 -1  0
4  0 -1  1
5  1 -1  2

请注意,我没有按列名索引,因为实际数据中有很多列,列名不固定。

replace_negatives <- function(data){
  df <<- data %>% 
    mutate(.[[1]] = if_else(.[[2]] < 0, 0, .[[1]])) %>%
    mutate(.[[3]] = if_else(.[[3]] < 0, NA, .[[3]])) 
  return(df)
}

lapply(df, replace_negatives)

但它引发了一个错误:

> replace_negatives <- function(data){
+   df <<- data %>% 
+     mutate(.[[1]] = if_else(.[[2]] < 0, 0, .[[1]])) %>%
Error: unexpected '=' in:
"  df <<- data %>% 
    mutate(.[[1]] ="
>     mutate(.[[3]] = if_else(.[[3]] < 0, NA, .[[3]])) 
Error: unexpected '=' in "    mutate(.[[3]] ="
>   return(df)
Error: no function to return from, jumping to top level
> }
Error: unexpected '}' in "}"

如有任何帮助,我们将不胜感激。

预期输出:

  x1 x2 x3
1  0 -1 NA
2  0 -1 NA
3  0 -1  0
4  0 -1  1
5  1 -1  2

要执行所需的操作,这里有一个基本的 R 方法:

df  <- data.frame(x1 = -3:1,      
                  x2 = -1,
                  x3 = -2:2)

df[[1]] <- ifelse(df[[1]] < 0, 0, df[[1]])
df[[3]] <- ifelse(df[[3]] < 0, NA, df[[3]])

df
#>   x1 x2 x3
#> 1  0 -1 NA
#> 2  0 -1 NA
#> 3  0 -1  0
#> 4  0 -1  1
#> 5  1 -1  2

reprex package (v2.0.1)

于 2022-04-18 创建

您可以在函数中使用 across

library(tidyverse)

replace_negatives <- function(data){
  df <- data %>%
    mutate(across(1, ~ ifelse(. < 0, 0, .)),
           across(3, ~ ifelse(. < 0, NA, .)))
  return(df)
}

replace_negatives(df)

输出

  x1 x2 x3
1  0 -1 NA
2  0 -1 NA
3  0 -1  0
4  0 -1  1
5  1 -1  2

这是你的函数的基础 R 版本:

replace_negatives <- function(df){
    is.na(df[,1]) <- df[,1] < 0
    index <- df[,3] < 0
    df[,3][index] <- 0
  return(df)
}


replace_negatives(df)
  x1 x2 x3
1 NA -1  0
2 NA -1  0
3 NA -1  0
4  0 -1  1
5  1 -1  2