Мутировать группу столбцов на основе значений в другой группе столбцов - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь преобразовать значения в одном столбце в NA в зависимости от того, являются ли значения в другом соответствующем столбце NA.Мне нужно сделать это для двух больших групп соответствующих столбцов, поэтому я не могу mutate каждый столбец один за другим.

Например, ниже 2002 inflationNext2Years превращается в NA, так как 2002 realReturnNext2YearsNA.

year <- c(2000, 2001, 2002)
realReturnNext1Years <- c(.1,.2,.3)
realReturnNext2Years <- c(.15,.25, NA)
realReturnNext3Years <- c(.45, NA, NA)
inflationNext1Years <- c(.02, .03, .07)
inflationNext2Years <- c(.03, .05, .08)
inflationNext3Years <- c(.04, .06, .09)
data <- data.frame(year, realReturnNext1Years, realReturnNext2Years, realReturnNext3Years, inflationNext1Years, inflationNext2Years, inflationNext3Years)
data
   year realReturnNext1Years realReturnNext2Years realReturnNext3Years inflationNext1Years inflationNext2Years inflationNext3Years
1 2000                  0.1                 0.15                 0.45                0.02                0.03                0.04
2 2001                  0.2                 0.25                   NA                0.03                0.05                0.06
3 2002                  0.3                   NA                   NA                0.07                0.08                0.09

Я пытаюсь преобразовать data в:

year realReturnNext1Years realReturnNext2Years realReturnNext3Years inflationNext1Years inflationNext2Years inflationNext3Years
2000                  0.1                 0.15                 0.45                0.02                0.03              0.04
2001                  0.2                 0.25                   NA                0.03                0.05              NA
2002                  0.3                   NA                   NA                0.07                NA                NA

Поскольку у меня много столбцов, я не могу сделать этот столбец за раз.Я пытался использовать mutate_at с ifelse(), но не знал, как проверить, совпадает ли число лет.

У меня есть вектор имен столбцов realReturn и еще один вектор inflation имена столбцов.Я пытаюсь изменить столбцы инфляции на NA, если их соответствующий realReturnColumn равен NA, но оставить столбец инфляции таким же, если realReturnColumn не равен NA.

1 Ответ

0 голосов
/ 17 мая 2018

Мы можем собирать индексы столбцов "realReturnNext", используя grep, получать позиции их NA и заменять соответствующие позиции в столбцах "инфляции" на NA 's

real_cols <- grep("^realReturnNext", colnames(data))
inflation_cols <- grep("^inflationNext", colnames(data))

data[inflation_cols][is.na(data[real_cols])] <- NA

#  year realReturnNext1Years realReturnNext2Years realReturnNext3Years
#1 2000                  0.1                 0.15                 0.45
#2 2001                  0.2                 0.25                   NA
#3 2002                  0.3                   NA                   NA

#  inflationNext1Years inflationNext2Years inflationNext3Years
#1                0.02                0.03                0.04
#2                0.03                0.05                  NA
#3                0.07                  NA                  NA
...