Home > OS >  iteratively mutate nested dataframes
iteratively mutate nested dataframes

Time:12-14

I have a list of dataframes with identical column names. I'd like to iterate through these dataframes, make some alteration to one of the columns, then apply that change back to the original dataframe. I know that doing this via iteration is not ideal, so if there's a better way using lapply, please educate me!

df <- list(
       '2020-01-01' = data.frame(value = c(3,5,7,8),
                  wt = c(1,1,1,1)),
       '2020-02-01' = data.frame(value = c(90,90,98,91),
                  wt = c(1,1,1,1)),
       '2020-03-01' = data.frame(value = c(0,10,3,8),
                  wt = c(1,1,1,1)))

for(i in df){

  data <- data.frame(
                 val = i$value,
                 wt = i$wt) %>%
  mutate(wt = ifelse(val > 95 | val < 5, 100, 1))

  # mutation works within the loop
  print(data)

  # But this bit does nothing
  i = data
}

print(df)

It seems that i = data is doing nothing. But if I do the same thing outside the loop, replacing i with a particular dataframe: df$'2020-01-01' it works fine:

data <- data.frame(val = df$`2020-01-01`$value,
               wt = df$`2020-01-01`$wt) %>% 
  mutate(wt = ifelse(val > 95 | val < 5, 100, 1))

df$`2020-01-01` = data

df

CodePudding user response:

Using lapply or purrr::map you could do:

library(dplyr)

df <- lapply(df, function(x) mutate(x, wt = if_else(value > 95 | value < 5, 100, 1)))
df
#> $`2020-01-01`
#>   value  wt
#> 1     3 100
#> 2     5   1
#> 3     7   1
#> 4     8   1
#> 
#> $`2020-02-01`
#>   value  wt
#> 1    90   1
#> 2    90   1
#> 3    98 100
#> 4    91   1
#> 
#> $`2020-03-01`
#>   value  wt
#> 1     0 100
#> 2    10   1
#> 3     3 100
#> 4     8   1
  • Related