мутировать и ifelse в определенных столбцах с NA - PullRequest
0 голосов
/ 22 октября 2018

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

 dput(test)
       structure(list(value = c(1, 0, 0, 0), value_lag_1 = c(0, 1, 0, 
       0), value_lag_2 = c(NA, 0L, 0L, 0L), value_lead_1 = c(0L, 0L, 
       0L, NA), value_lead_2 = c(0L, 0L, 0L, 0L), ref = c(1, 1, 0, 1
       )), .Names = c("value", "value_lag_1", "value_lag_2", "value_lead_1", 
       "value_lead_2", "ref"), row.names = 2:5, class = "data.frame")

Я хочу сравнить пять первых столбцов с последними (ссылка).Если любой из первых 5 столбцов равен 1, а ref равен 1, то 1, иначе 0, поэтому мой результат (sim) будет:

value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
    1           0          NA            0            0     1   1
    0           1           0            0            0     1   1
    0           0           0            0            0     0   0
    0           0           0           NA            0     1   0

Я пробовал следующее, но безуспешно:

 myvar <- names(test)[1:5]
 test%>%
          mutate(sim=ifelse( any(myvar!=0,na.rm=T) & ref==1,1,0))

Есть идеи применить условия?Любые другие предложения приветствуются.

Большое спасибо

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Нет необходимости в ifelse, поскольку все ваши условия легко выводятся с помощью "0" как FALSE и "не 0" как TRUE:

test$sim <- rowSums(test[1:5], na.rm=TRUE) & test[[6]]
test
#   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
# 2     1           0          NA            0            0   1  TRUE
# 3     0           1           0            0            0   1  TRUE
# 4     0           0           0            0            0   0 FALSE
# 5     0           0           0           NA            0   1 FALSE

или буквального 0/1:

test$sim <- as.integer( rowSums(test[1:5], na.rm=TRUE) & test[[6]] )
test
#   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
# 2     1           0          NA            0            0   1   1
# 3     0           1           0            0            0   1   1
# 4     0           0           0            0            0   0   0
# 5     0           0           0           NA            0   1   0
cc(4)
# (converted)
0 голосов
/ 22 октября 2018
test$sim <- rowSums(test[, 1:5], na.rm = T) >= 1 | test[, 6] == 1
0 голосов
/ 22 октября 2018

Опираясь на то, с чего вы начали dplyr, попробуйте

test %>% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) & ref == 1, 1, 0)) или

test %>% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) > 0 & ref == 1, 1, 0))

0 голосов
/ 22 октября 2018
test$sim <- rowSums(df[, 1:5], na.rm = T) >= 1 & test$ref == 1

  value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
2     1           0          NA            0            0   1  TRUE
3     0           1           0            0            0   1  TRUE
4     0           0           0            0            0   0 FALSE
5     0           0           0           NA            0   1 FALSE

вы можете преобразовать sim в числовое значение, если оно вам действительно нужно в формате 0 и 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...