Изменить значение столбца, если другие конкретные столбцы с определенным значением? - PullRequest
0 голосов
/ 03 июня 2018

Учтите, у меня есть 3 столбца:

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 

Я хочу изменить / изменить столбец var3, если var1 и var2 подчиняются правилу, подобному:

var1 and var2 == 1

Я пытаюсь сделать это с mutate_at:

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

Пожалуйста, сообщите, что мне здесь не хватает, это не работает.

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Использование ifelse

library(dplyr)


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)


df %>% 
  mutate(var3 = ifelse(var1 == 1 & var2 == 1,
                       2,
                       var3))

Результат:

  var1 var2 var3
1    1    1    2
2    0    1    1
3    1    0    1
4    0    0    1
5    1    1    2
6    0    1    0
7    1    0    0
8    0    0    0
0 голосов
/ 03 июня 2018

case_when дает большую гибкость для нормотворчества.

 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).
0 голосов
/ 03 июня 2018

Вы можете достичь того же самого разными способами, включая mutate.Вы даже можете сделать это с dpplyr::mutate_at.Вам нужно немного изменить логику следующим образом:

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

Примечание: Единственная мотивация, которую я могу придумать при использовании mutate_at, была бы, если бы у вас было много других столбцов, таких как var3var4 и т. Д., Которые должны были обрабатываться с аналогичной логикой.Только для одного столбца это только усложнит ситуацию.

Данные:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...