问题描述
我有一个列名的数据框:X、时间、“indoors_c”和“outdoors_c”。时间 >= 13 时,我想将名称包含字符串“_c”的列中的行值替换为 0。如何在不引用整个列名的情况下执行此操作?我正在使用 R 工作室
解决方法
使用 tidyverse
、sse across()
和 contains()
中的函数来选择要应用该函数的列。然后对函数使用 if_else
,如果列 time 高于/低于某个值,则放置 0
值。
可重现的小例子:
library(tidyverse)
data <- tibble(X=rnorm(20),time=1:20,indoors_c=rnorm(20),outdoors_c=rnorm(20))
data %>%
mutate(across(contains("_c"),~ if_else(time>=13,.)))
#> # A tibble: 20 x 4
#> X time indoors_c outdoors_c
#> <dbl> <int> <dbl> <dbl>
#> 1 -1.67 1 -2.41 -1.44
#> 2 1.00 2 0.113 0.701
#> 3 0.386 3 0.0248 -0.425
#> 4 0.266 4 -0.431 -0.0722
#> 5 -0.206 5 0.255 -1.34
#> 6 -0.617 6 0.441 0.761
#> 7 1.42 7 0.481 -0.892
#> 8 0.207 8 -0.112 -0.906
#> 9 1.42 9 -0.465 -0.527
#> 10 -0.934 10 -2.21 2.95
#> 11 -0.419 11 -0.639 -0.113
#> 12 0.812 12 -0.180 0.440
#> 13 0.331 13 0 0
#> 14 -0.454 14 0 0
#> 15 -0.0290 15 0 0
#> 16 0.167 16 0 0
#> 17 -0.150 17 0 0
#> 18 0.922 18 0 0
#> 19 1.77 19 0 0
#> 20 1.62 20 0 0
由 reprex package (v2.0.0) 于 2021 年 5 月 23 日创建
,我们可以使用case_when
library(dplyr)
data %>%
mutate(across(ends_with('_C'),~ case_when(time > 0 ~ 0,TRUE ~ .)))