2016-10-24 4 views
8
library(tidyverse) 
mytbl <- tibble(a = rep(c(1,1,0,1), 4), b= rep(c(1,0,0,1), 4)) 

    # A tibble: 16 × 2 
      a  b 
     <dbl> <dbl> 
    1  1  1 
    2  1  0 
    3  0  0 
    4  1  1 
    5  1  1 
    6  1  0 
    7  0  0 
    8  1  1 
    9  1  1 
    10  1  0 
    11  0  0 
    12  1  1 
    13  1  1 
    14  1  0 
    15  0  0 
    16  1  1 

Если я кондиционировать на второй колонке все хорошоУсловный замена с использованием mutate_all dplyr в

dplyr::mutate_all(mytbl, funs(replace(., b != 0, NA))) 

    # A tibble: 16 × 2 
      a  b 
     <dbl> <dbl> 
    1  NA NA 
    2  1  0 
    3  0  0 
    4  NA NA 
    5  NA NA 
    6  1  0 
    7  0  0 
    8  NA NA 
    9  NA NA 
    10  1  0 
    11  0  0 
    12 NA NA 
    13 NA NA 
    14  1  0 
    15  0  0 
    16 NA NA 

Но если условие на первом столбце только первый столбец заменяется

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA))) 

    # A tibble: 16 × 2 
      a  b 
     <dbl> <dbl> 
    1  NA  1 
    2  NA  0 
    3  0  0 
    4  NA  1 
    5  NA  1 
    6  NA  0 
    7  0  0 
    8  NA  1 
    9  NA  1 
    10 NA  0 
    11  0  0 
    12 NA  1 
    13 NA  1 
    14 NA  0 
    15  0  0 
    16 NA  1 

I я уверен, что я делаю что-то не так в моем подходе, и я мог бы сделать это не-dplyr, но похоже, что это должно сработать. Вы можете расширить это с помощью большего количества столбцов для аналогичного результата.

+0

Это выглядит странно. Попробуйте с 'if_else' i.e. mytbl%>% mutate_all (funs (if_else (a! = 0,., NA_real _)))' – akrun

+1

Это действительно действительно странно. 'ifelse' не имеет такого поведения, поэтому, если вы просто хотите, чтобы он работал, @akrun вы закрыли. Однако поведение действительно странно. Если я использую 'select', чтобы отменить порядок столбцов, ошибка меняется, поэтому проблема с упорядочением столбцов. Если я использую 'mutate_each (..., everything())', я получаю ту же проблему, но если я использую 'mutate_each (..., b)', он правильно назначает 'NA' в столбце 'b'. Хотелось бы, чтобы у меня был лучший ответ для вас, но я понятия не имею, что происходит. –

ответ

2

Я думаю (но у вас нет доказательств;)) это потому, что a изменен, а затем состояние переустановлено. Так что, когда вы делаете

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA))) 

a не получает мутировал (так он больше не содержит ненулевые значения) - то условие a != 0 повторно оценены, но никогда не возвращает TRUE. Если вы изменили это на, например,

dplyr::mutate_all(mytbl, funs(replace(., a > 0, 10))) 

это даст желаемое поведение. Вы можете попробовать

dplyr::mutate_all(mytbl, funs(replace(., mytbl$a != 0, NA))) 

, который не будет обновлять столбец a «на лету», так даст желаемого результата.

Смежные вопросы