代码之家  ›  专栏  ›  技术社区  ›  Jeremy K.

如果==0,则仅替换指定列中的值

  •  1
  • Jeremy K.  · 技术社区  · 5 年前

    我有一些像这样的数据:

      ID Married Age Visits
    1  1       0  35      0
    2  2       1   0      7
    3  3       0  29     19
    
    df <- data.frame(
              ID = c(1L, 2L, 3L),
         Married = c(0L, 1L, 0L),
             Age = c(35L, 0L, 29L),
          Visits = c(0L, 7L, 19L)
    )
    

    假设对于这些数据, Married 是一个虚拟变量,但是 Age Visits 绝对不应该是0。我想知道如何做两件事:

    1. 如何替换,仅在列中 年龄 访问 ,是否替换0值的na?
    2. 如何替换,仅在列中 年龄 访问 ,是否将-999替换为0值?这个只是为了好奇,因为我想知道如何不用 na_if() .

    这个代码不太正确,因为它也更改了已婚列。

    df <- na_if(df, 0)
    

    给:

      ID Married Age Visits
    1  1      NA  35     NA
    2  2       1  NA      7
    3  3      NA  29     19
    

    然而,我想要的是(1):

      ID Married Age Visits
    1  1       0  35     NA
    2  2       1  NA      7
    3  3       0  29     19
    

    (2):

      ID Married Age Visits
    1  1       0  35    -999
    2  2       1  -999    7
    3  3       0  29     19
    

    我试过这样的方法:

    df <- na_if(c(df$Age, df$Visits), 0))
    

    但那是不对的。

    3 回复  |  直到 5 年前
        1
  •  2
  •   Ronak Shah    5 年前

    你可以做到

    方案1)

    library(dplyr)
    cols <- c("Age", "Visits")
    df[cols] <- na_if(df[cols], 0)
    
    df
    #  ID Married Age Visits
    #1  1       0  35     NA
    #2  2       1  NA      7
    #3  3       0  29     19
    

    方案2)

    df[cols][df[cols] == 0] <- -999
    
    df
    #  ID Married  Age Visits
    #1  1       0   35   -999
    #2  2       1 -999      7
    #3  3       0   29     19
    

    类似于解决方案2)您也可以执行解决方案1)作为

    df[cols][df[cols] == 0] <- NA
    
        2
  •  1
  •   Kenji    5 年前

    你可能想试试

    df$Age[is.na(df$Age)] <- 0
    df$Age[df$Age == -999] <- 0
    
        3
  •  0
  •   Amir Sariaslan    5 年前

    下面是一个解决您问题的dplyr解决方案。

    library(tidyverse)
    df %>% mutate_at(vars(Age,Visits),funs(na_if(.,0)))
    df %>% mutate_at(vars(Age,Visits),funs(ifelse(. == 0,-999,.)))