使用此base::replace
功能,我想z
基于列的值更改列的一些值y
library(tidyverse)
(df <- tibble(y = 10:13, z = 20:23))
#> # A tibble: 4 x 2
#> y z
#> <int> <int>
#> 1 10 20
#> 2 11 21
#> 3 12 22
#> 4 13 23
我有data.frame val
,其中列a
将用作条件的值,而列b
将是替换值。
(val <- tibble(a = c(10, 12), b = c(100, 200)))
#> # A tibble: 2 x 2
#> a b
#> <dbl> <dbl>
#> 1 10 100
#> 2 12 200
使用以下方法可以得到期望的结果,但是只有当其中所有值val
都在内部时,它才有效df
df %>% mutate(z = replace(z, y %in% val$a, val$b))
#> # A tibble: 4 x 2
#> y z
#> <int> <dbl>
#> 1 10 100
#> 2 11 21
#> 3 12 200
#> 4 13 23
例如,如果我更新val
为具有不在中的值df
,则:
(val <- tibble(a = c(1, 10, 12), b = c(1, 100, 200)))
#> # A tibble: 3 x 2
#> a b
#> <dbl> <dbl>
#> 1 1 1
#> 2 10 100
#> 3 12 200
然后我再次运行代码...
df %>% mutate(z = replace(z, y %in% val$a, val$b))
#> Warning in x[list] <- values: number of items to replace is not a multiple of
#> replacement length
#> # A tibble: 4 x 2
#> y z
#> <int> <dbl>
#> 1 10 1
#> 2 11 21
#> 3 12 100
#> 4 13 23
有错误...我该如何解决?
由reprex软件包(v1.0.0)创建于2021-02-19
我们不需要任何内容,map
因为'a','b'和'df'的行数具有相同的长度。因此,==
可以与进行元素比较。取而代之的是replace
,使用ifelse/case_when
etc可能更好,因为replace
values
它的长度应与list
条件TRUE元素的长度相同
library(dpyr)
df %>%
mutate(z = case_when(a == y ~ as.integer(b), TRUE ~ z))
-输出
# A tibble: 3 x 2
# y z
# <int> <int>
#1 10 100
#2 11 200
#3 12 22
或使用 base R
df$z <- with(df, ifelse(a == y, b, z))
在OP的代码中,length
我们执行操作的时间有所不同
replace(x = z, y == .x, values = .y)
其中“ z”将是整列长度.x
,.y
将是每一行元素
根据更新的数据,我们可以加入然后使用 coalesce
df %>%
left_join(val, by = c('y' = 'a')) %>%
transmute(y, z = coalesce(b, z))
# A tibble: 4 x 2
# y z
# <dbl> <dbl>
#1 10 100
#2 11 21
#3 12 200
#4 13 23
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句