Преобразовать новую переменную, используя значение одной из двух переменных в зависимости от условия - PullRequest
1 голос
/ 06 мая 2020

У меня большой набор данных, и я пытаюсь создать новый столбец, который включает либо переменную 1, либо переменную 2 на основе другого сценария ios. Я уже преобразовал различные сценарии ios в группы (от 1 до 4 в столбце «Сценарий»).

Где переменные 1 и 2 заполняются значением для определенного образца c. Мне нужна переменная 1 для имеют приоритет над переменной 2 в столбце New_Var (это сценарий 1). Если переменная 1 имеет значение, а переменная 2 имеет значение NA для указанного c образца, мне нужно заполнить образец в столбце New_Var значением переменной 1 (это сценарий 2). Где переменная 1 - это NA, а переменная 2 - это значение для определенного c образца. Мне нужна переменная 2 для заполнения столбца New_Var (это сценарий 3). Если обе переменные 1 и 2 являются NA, мне нужен результат NA, указанный в столбце New_Var.

Мне уже удалось изменить новый столбец с помощью dplyr для каждого сценария, но я не знаю, как сгенерировать столбец New_Var для желаемого результата ниже.

Sample <- c('ID1','ID2','ID3','ID4','ID5','ID6','ID7','ID8','ID9','ID10','ID11') 
Var1 <- c(1,1,1,1.5,2.1,4,NA,NA,NA,NA,NA)
Var2 <- c(3,5,1,NA,NA,NA,1.6,1.4,2,NA,NA)
Scenario <- c(1,1,1,2,2,2,3,3,3,4,4)
New_Var <- c(1,1,1,1.5,2.1,4,1.6,1.4,2,0,0)
df <- data.frame(Sample,Var1,Var2,Scenario,New_Var)
df

   Sample Var1 Var2 Scenario New_Var
1     ID1  1.0  3.0        1     1.0
2     ID2  1.0  5.0        1     1.0
3     ID3  1.0  1.0        1     1.0
4     ID4  1.5   NA        2     1.5
5     ID5  2.1   NA        2     2.1
6     ID6  4.0   NA        2     4.0
7     ID7   NA  1.6        3     1.6
8     ID8   NA  1.4        3     1.4
9     ID9   NA  2.0        3     2.0
10   ID10   NA   NA        4     NA
11   ID11   NA   NA        4     NA

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Вы можете использовать coalesce, который обрабатывает все 4 случая, как описано.

library(dplyr)
df %>%  mutate(newvar = coalesce(Var1, Var2))

#   Sample Var1 Var2 Scenario newvar
#1     ID1  1.0  3.0        1    1.0
#2     ID2  1.0  5.0        1    1.0
#3     ID3  1.0  1.0        1    1.0
#4     ID4  1.5   NA        2    1.5
#5     ID5  2.1   NA        2    2.1
#6     ID6  4.0   NA        2    4.0
#7     ID7   NA  1.6        3    1.6
#8     ID8   NA  1.4        3    1.4
#9     ID9   NA  2.0        3    2.0
#10   ID10   NA   NA        4     NA
#11   ID11   NA   NA        4     NA

Или используйте ifelse в базе R / dplyr:

transform(df, newvar = ifelse(is.na(Var1), Var2, Var1))
df %>% mutate(newvar = if_else(is.na(Var1), Var2, Var1))
1 голос
/ 06 мая 2020

Мы можем использовать fcoalesce из data.table

library(data.table)
setDT(df)[, newvar := fcoalesce(Var1, Var2)]
...