如果具有特定值的其他特定列,则更改列值?

时间:2018-06-03 13:32:35

标签: r dataframe dplyr mutate

考虑我有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 

如果var3var1遵守以下规则,我想改变/更改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 :(得分:1)

您可以通过多种不同方式实现相同目标,包括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_atvar3等,我可以考虑使用var4的唯一动机将以类似的逻辑进行处理。对于一个列,它只会使事情变得更复杂。

数据:

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 :(得分:1)

使用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

答案 2 :(得分:1)

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).