Заменить значения только в указанных столбцах, если == 0 - PullRequest
2 голосов
/ 16 марта 2019

У меня есть некоторые данные, которые выглядят так:

  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. Как заменить, только в столбцах Age и Visits, заменить NA назначения 0?
  2. Как заменить, только в столбцах Age и Visits, заменить -999 для значений 0?Это просто для любопытства, потому что я хотел бы знать, как это сделать без использования na_if().

Этот код не совсем верный, потому что он также меняет столбец Married.

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 ]

3 голосов
/ 16 марта 2019

Вы можете сделать

Решение 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 голосов
/ 16 марта 2019

Вот dplyr решение вашей проблемы.

library(tidyverse)
df %>% mutate_at(vars(Age,Visits),funs(na_if(.,0)))
df %>% mutate_at(vars(Age,Visits),funs(ifelse(. == 0,-999,.)))
1 голос
/ 16 марта 2019

Возможно, вы захотите попробовать

df$Age[is.na(df$Age)] <- 0
df$Age[df$Age == -999] <- 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...