2016-10-24 1 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 

Wenn ich alle auf der zweiten Spalte Bedingung ist gutConditional Ersatz mit dplyr des mutate_all

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 

Aber wenn ich auf der ersten Spalte Bedingung nur die erste Spalte

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 ersetzt bin mir sicher, dass ich bei meiner Vorgehensweise etwas falsch mache, und ich könnte das sicherlich nicht-doprig machen, aber es scheint, dass das funktionieren sollte. Sie können dies mit mehr Spalten für ein ähnliches Ergebnis erweitern.

+0

Das sieht seltsam aus. Versuchen Sie es mit 'if_else', d. H.' Mytbl%>% mutate_all (Spaß (if_else (a! = 0,., NA_real _))) ' – akrun

+1

Das ist wirklich seltsam. 'ifelse' hat dieses Verhalten nicht, also wenn Sie nur wollen, dass es funktioniert, hat @akrun Sie abgedeckt. Das Verhalten ist jedoch wirklich merkwürdig. Wenn ich 'select' verwende, um die Spaltenreihenfolge umzukehren, kehrt sich der Fehler um, so dass es ein Problem mit der Spaltenreihenfolge gibt. Wenn ich 'mutate_each (..., everything())' verwende, bekomme ich das gleiche Problem, aber wenn ich 'mutate_each (..., b)' verwende, weist es die 'NA's in Spalte' b' korrekt zu. Ich wünschte, ich hätte eine bessere Antwort für Sie, aber ich habe keine Ahnung, was vor sich geht. –

Antwort

2

Ich denke (aber habe keinen Beweis;)) das ist, weil a wird geändert und dann wird der Zustand erneut überprüft. Also, wenn Sie tun

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

a wird mutiert (so ist es nicht mehr enthält Nicht-Null-Werte) - dann ist die Bedingung a != 0 wird neu bewertet, aber nie wieder TRUE. Wenn Sie dies z.

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

es würde das gewünschte Verhalten geben. Sie können versuchen,

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

, die nicht die Spalte a "on the fly", so das gewünschte Ergebnis geben wird aktualisiert.