问题描述
我在让 mutate、cross 和 case_when 正常运行时遇到了一些麻烦,我在这里重新创建了一个简单版本的问题:
a <- c(1:10)
b <- c(2:11)
c <- c(3:12)
test <- tibble(a,b,c)
# A tibble: 10 x 3
a b c
<int> <int> <int>
1 1 2 3
2 2 3 4
3 3 4 5
4 4 5 6
5 5 6 7
6 6 7 8
7 7 8 9
8 8 9 10
9 9 10 11
10 10 11 12
我的目标是用 4 替换所有 3,并保持其他所有内容相同。我有以下代码:
test_1 <-
test %>%
mutate(across(a:c,~ case_when(. == 3 ~ 4)))
# A tibble: 10 x 3
a b c
<dbl> <dbl> <dbl>
1 NA NA 4
2 NA 4 NA
3 4 NA NA
4 NA NA NA
5 NA NA NA
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
很接近,但我得到了 NA 值,我想在原始 tibble 中保持该值。 如何使用跨结构变异保持原始值?
先谢谢你!
解决方法
这个怎么样?
> test %>%
+ mutate(across(a:c,~ case_when(. == 3 ~ 4,TRUE ~ 1 * (.))))
# A tibble: 10 x 3
a b c
<dbl> <dbl> <dbl>
1 1 2 4
2 2 4 4
3 4 4 5
4 4 5 6
5 5 6 7
6 6 7 8
7 7 8 9
8 8 9 10
9 9 10 11
10 10 11 12
或
> test %>%
+ replace(. == 3,4)
# A tibble: 10 x 3
a b c
<int> <int> <int>
1 1 2 4
2 2 4 4
3 4 4 5
4 4 5 6
5 5 6 7
6 6 7 8
7 7 8 9
8 8 9 10
9 9 10 11
10 10 11 12
,
在base R
,我们可以做到
test[test ==3] <- 4
,
这也有效:
a <- c(1:10)
b <- c(2:11)
c <- c(3:12)
tibble(a,b,c) %>%
modify(~ ifelse(. == 3,4,.))
# A tibble: 10 x 3
a b c
<dbl> <dbl> <dbl>
1 1 2 4
2 2 4 4
3 4 4 5
4 4 5 6
5 5 6 7
6 6 7 8
7 7 8 9
8 8 9 10
9 9 10 11
10 10 11 12