I have a dataframe with column names: X, time, "indoors_c" and "outdoors_c". Where time is >= 13, I want to replace the value of the rows in columns with names containing the string "_c" with 0. How do I do this without referring to the entire column name? I am using R studio
            Asked
            
        
        
            Active
            
        
            Viewed 51 times
        
    -1
            
            
        - 
                    1Please can you share a reproducible example of your data using ``dput()`` and edit the output into your question. Thanks. – user438383 May 23 '21 at 18:05
- 
                    1It's easier to help you if you include a simple [reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) with sample input and desired output that can be used to test and verify possible solutions. – MrFlick May 23 '21 at 18:06
2 Answers
2
            
            
        Using functions from tidyverse, sse across() together with contains() to select the columns over which to apply the function. Then use if_else for the function, putting 0 values if column time is above/below some value.
Small reproducible example:
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, 0, .)))
#> # 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
Created on 2021-05-23 by the reprex package (v2.0.0)
1
            
            
        We can use case_when
library(dplyr)
data %>%
    mutate(across(ends_with('_C'), ~ case_when(time > 0 ~ 0, TRUE ~ .)))
 
    
    
        akrun
        
- 874,273
- 37
- 540
- 662
 
     
    