【问题标题】:Use lapply on condition in R在 R 的条件下使用 lapply
【发布时间】:2022-11-03 16:03:50
【问题描述】:

如果您先查看代码,则更容易解释我想要做什么,但基本上我想我想在一个条件下使用 lapply 但我无法做到。

library("tidyverse")
names <- rep(c("City A", "City B"), each = 11)
year <- rep(c(2010:2020), times = 2)
col_1 <- c(1, 17, 34, 788, 3, 4, 78, 98, 650, 45, 20,
           23, 45, 56, 877, 54, 12, 109, 167, 12, 19, 908)
col_2 <- c(3, 4, 23, 433, 2, 45, 34, 123, 98, 76, 342,
           760, 123, 145, 892, 23, 5, 90, 40, 12, 67, 98)

df <- as.data.frame(cbind(names, year, col_1, col_2))

df <- df %>%
  mutate(col_1 = as.numeric(col_1),
         col_2 = as.numeric(col_2))

我希望 2018 年及以后的每个数字列都用 round_any 舍入为三的倍数 (plyr::round_any, 3) 我尝试的是这样的:

df_2018 <- df %>%
  filter(year >= 2018)

df <- df %>%
  filter(!(year >= 2018))
  
df_2018[, c(3:4)] <- lapply(df_2018[, c(3:4)], plyr::round_any, 3)
  
df <- rbind(df, df_2018)

实际上,大约有 50 个数字列和大量行。我尝试过的理论上可行,但我想用更少的代码和更清洁的方式来实现它。 我是使用 lapply 的新手,但我没有尝试将它与 ifelse 结合起来,因为我不希望它改变我的年份列。

感谢所有抽出时间来看看这个的人:)

【问题讨论】:

    标签: r conditional-statements lapply


    【解决方案1】:

    使用 dplyr::acrossif_else 你可以:

    library(dplyr)
    
    df |> 
      mutate(across(-c(names, year), ~ if_else(year >= 2018, plyr::round_any(.x, 3), .x)))
    #>     names year col_1 col_2
    #> 1  City A 2010     1     3
    #> 2  City A 2011    17     4
    #> 3  City A 2012    34    23
    #> 4  City A 2013   788   433
    #> 5  City A 2014     3     2
    #> 6  City A 2015     4    45
    #> 7  City A 2016    78    34
    #> 8  City A 2017    98   123
    #> 9  City A 2018   651    99
    #> 10 City A 2019    45    75
    #> 11 City A 2020    21   342
    #> 12 City B 2010    23   760
    #> 13 City B 2011    45   123
    #> 14 City B 2012    56   145
    #> 15 City B 2013   877   892
    #> 16 City B 2014    54    23
    #> 17 City B 2015    12     5
    #> 18 City B 2016   109    90
    #> 19 City B 2017   167    40
    #> 20 City B 2018    12    12
    #> 21 City B 2019    18    66
    #> 22 City B 2020   909    99
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多