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

时间:2019-03-16 02:21:13

标签: r dplyr

我有一些看起来像这样的数据:

  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是一个虚拟变量,但是AgeVisits绝对不应为0。我想知道如何做两件事:

  1. 如何仅在AgeVisits列中替换NA替换0值?
  2. 如何仅在AgeVisits列中替换-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 个答案:

答案 0 :(得分:3)

你可以做

解决方案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

答案 1 :(得分:2)

这是解决您问题的好方法。

                         $('.weekdays').timePicker({   
                                startTime: "08:00", 
                                endTime: "22:00",
                                show24Hours: false,
                                step: 30                  
                        });

答案 2 :(得分:1)

您可能想尝试

df$Age[is.na(df$Age)] <- 0
df$Age[df$Age == -999] <- 0