考虑我有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))
请告知我在这里缺少什么,它不起作用。
答案 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_at
,var3
等,我可以考虑使用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).