【问题标题】:Is there a tidyverse Solution to changing the values of multiple columns to a specific value. R是否有将多个列的值更改为特定值的 tidyverse 解决方案。 R
【发布时间】:2021-11-27 01:24:29
【问题描述】:

CDC 使用 tidyverse/dplyr 提供的美国疫苗接种总数

原始数据集来自 https://covid.cdc.gov/covid-data-tracker/#vaccinations_vacc-total-admin-rate-total

我正在总结感兴趣的变量。我希望将包含“PCT”的列更改为 NA,因为百分比的总和没有意义。

# summarise_all(CDC_vacc_State, ~if(is.numeric(.)) sum(., na.rm = T) else "National")

这里我要输出数据集。在这里我们可以看到有 8 列包含“PCT”。 我确实知道我的全国人口减少了 120 万,我从数据中反向解决了这个问题,而不是在人口普查值中合并。

# dput(summarise_all(CDC_vacc_State, ~if(is.numeric(.)) sum(., na.rm = T) else "National"))

df <- structure(
  list(
    STATE = "National",
    ONE_DOSE_NUM = 220978782,
    ONE_DOSE_PCT = 3752.9,
    FULL_DOSE_NUM = 190719566,
    FULL_DOSE_PCT = 3276.7,
    POP = 334203604,
    ONE_DOSE_NUM_18Plus = 206114881,
    ONE_DOSE_PCT_18Plus = 4412.7,
    FULL_DOSE_NUM_18Plus = 178587829,
    FULL_DOSE_PCT_18Plus = 3883.9,
    POP_18Plus = 258316189,
    ONE_DOSE_NUM_65Plus = 53312849,
    ONE_DOSE_PCT_65Plus = 5112.9,
    FULL_DOSE_NUM_65Plus = 47324330,
    FULL_DOSE_PCT_65Plus = 4652.6,
    POP_65Plus = 55128330,
    ONE_DOSE_NUM_12Plus = 219898471,
    ONE_DOSE_PCT_12Plus = 4258.4,
    FULL_DOSE_NUM_12Plus = 189835922,
    FULL_DOSE_PCT_12Plus = 3733.8,
    POP_12Plus = 282154872
  ),
  class = c("tbl_df", "tbl", "data.frame"),
  row.names = c(NA,-1L)
)

使用 tidyverse 将包含“PCT”的列中的值更改为 NA?

我想出了一个解决方案,但我希望使用 dplyr 内联并使用原始数据集的 bind_rows() 或 rbindlist()。

# this is my current solution
df[,names(select(df, contains('PCT')))] <- NA  

最终数据集的样子

dput(df)

structure(list(STATE = "National", ONE_DOSE_NUM = 220978782, 
    ONE_DOSE_PCT = NA, FULL_DOSE_NUM = 190719566, FULL_DOSE_PCT = NA, 
    POP = 334203604, ONE_DOSE_NUM_18Plus = 206114881, ONE_DOSE_PCT_18Plus = NA, 
    FULL_DOSE_NUM_18Plus = 178587829, FULL_DOSE_PCT_18Plus = NA, 
    POP_18Plus = 258316189, ONE_DOSE_NUM_65Plus = 53312849, ONE_DOSE_PCT_65Plus = NA, 
    FULL_DOSE_NUM_65Plus = 47324330, FULL_DOSE_PCT_65Plus = NA, 
    POP_65Plus = 55128330, ONE_DOSE_NUM_12Plus = 219898471, ONE_DOSE_PCT_12Plus = NA, 
    FULL_DOSE_NUM_12Plus = 189835922, FULL_DOSE_PCT_12Plus = NA, 
    POP_12Plus = 282154872), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r dplyr tidyverse contains


    【解决方案1】:

    dplyr 相当于您的 df[,names(select(df, contains('PCT')))] &lt;- NA:

    df %>%
      mutate(across(contains("PCT"), ~NA))
    

    或者,您可以通过仅汇总非 PCT 列来处理这种“下游”。如果您 bind_rows 到您的原始数据,我相信 PCT 列将不适用,因为它们不会出现在此处的结果中:

    df %>%  
      summarize(across(where(is.numeric) & !contains("PCT"),
                       ~sum(.x, na.rm = T)))
    

    【讨论】:

    • 非常有帮助,谢谢您的微小更改,一切都运行良好。 bind_rows(CDC_vacc_State, summarise_all(CDC_vacc_State, ~if(is.numeric(.)) sum(., na.rm = T) else "National") %&gt;% mutate(across(contains("PCT"), ~NA)) )
    • 最好的方法!
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2021-03-26
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多