Rozważ I mam 3 kolumny:

var1 var2 var3 
1    1    1     
0    1    1     
1    0    1    
0    0    1    
1    1    0    
0    1    0    
1    0    0    
0    0    0 

Chcę mu się zmienić / zmienić kolumnę var3, jeśli var1 i var2 przestrzegaj reguły takiej jak:

var1 and var2 == 1

Próbuję to zrobić za pomocą mutate_at:

df %>% mutate_at(.vars = vars(var1, var2, var3), 
                 .funs = funs(ifelse(var1 & var2, var3 = 5, var3 = 2))

Proszę doradzić, czego tu brakuje, nie działa.

0
SteveS 3 czerwiec 2018, 16:32

2 odpowiedzi

Najlepsza odpowiedź

Możesz osiągnąć to samo o wiele różnych sposobów, w tym mutate. Możesz nawet zrobić to z dpplyr::mutate_at. Musisz lekko zmienić logikę jako:

library(dplyr)

df %>% mutate_at(vars(c("var3")), funs(ifelse(var1==1 & var2 == 1, 5, 2)))

#   var1 var2 var3
# 1    1    1    5
# 2    0    1    2
# 3    1    0    2
# 4    0    0    2
# 5    1    1    5
# 6    0    1    2
# 7    1    0    2
# 8    0    0    2

Uwaga: Jedyną motywacją mogę myśleć o użyciu mutate_at byłoby, gdyby miało wiele innych kolumn, takich jak {X2}}, var4 itp., Które były przetwarzane z podobną logiką. Za jedną kolumnę po prostu sprawi, że rzeczy bardziej skomplikowane.

Dane:

df <- read.table(text =
"var1 var2 var3 
1    1    1     
0    1    1     
1    0    1    
0    0    1    
1    1    0    
0    1    0    
1    0    0    
0    0    0",
header = TRUE, stringsAsFactors = FALSE)
1
MKR 3 czerwiec 2018, 13:38

case_when daje dużo elastyczności dla reguł.

 df %>% 
  mutate(
      var3 = case_when(
        var1==1 & var2==1 ~ "my.new.variable",
        TRUE ~ as.character(var3)
      )
    )

#> # A tibble: 8 x 3
#>    var1  var2 var3           
#>   <dbl> <dbl> <chr>          
#> 1  1.00  1.00 my.new.variable
#> 2  0     1.00 1              
#> 3  1.00  0    1              
#> 4  0     0    1              
#> 5  1.00  1.00 my.new.variable
#> 6  0     1.00 0              
#> 7  1.00  0    0              
#> 8  0     0    0
```

Created on 2018-06-03 by the [reprex package](http://reprex.tidyverse.org) (v0.2.0).
1
Nettle 3 czerwiec 2018, 16:10