【问题标题】:Function to create percent variables in a data frame在数据框中创建百分比变量的函数
【发布时间】:2021-02-11 01:08:09
【问题描述】:

我有一个非常大的人口普查区数据集,可以保存两组年份。我需要为多个变量(大约 75 个)创建百分比变量。这是我的数据集中种族变量的一个子集:

Rows: 146,112
Columns: 13
$ tractid <chr> "01001020100", "01001020100", "01001020200", "01001020200", "01001020300", "01001020300", "01001020400", "01001020400", "01001020500", "01001020…
$ year    <chr> "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", …
$ pop     <dbl> 1808, 1993, 2355, 1959, 3057, 3507, 4403, 3878, 10851, 10596, 3408, 3668, 2744, 3586, 3310, 3196, 10182, 11142, 5844, 6143, 3390, 2527, 3555, 31…
$ racetot <dbl> 1808, 1993, 2355, 1959, 3057, 3507, 4403, 3878, 10851, 10596, 3408, 3668, 2744, 3586, 3310, 3196, 10182, 11142, 5844, 6143, 3390, 2527, 3555, 31…
$ nhtot   <dbl> 1808, 1967, 2304, 1929, 3002, 3274, 4100, 3836, 10684, 10127, 3167, 3503, 2699, 3335, 3032, 3153, 10027, 10927, 5800, 6117, 3364, 2497, 3555, 31…
$ nhwht   <dbl> 1576, 1685, 776, 759, 2359, 2285, 3923, 3495, 8500, 7982, 2885, 2863, 2219, 2658, 2951, 2751, 9027, 9375, 5248, 5250, 2423, 1942, 1110, 1482, 25…
$ nhblk   <dbl> 148, 152, 1465, 1117, 559, 857, 130, 216, 1766, 1929, 430, 693, 474, 730, 275, 436, 976, 1607, 529, 625, 949, 516, 2375, 1660, 768, 378, 284, 22…
$ nhnat   <dbl> 10, 0, 0, 0, 15, 0, 22, 32, 39, 0, 0, 0, 0, 20, 21, 0, 0, 0, 28, 63, 3, 2, 0, 23, 112, 171, 27, 75, 74, 245, 98, 70, 32, 19, 0, 7, 32, 28, 0, 0,…
$ nhasian <dbl> 0, 2, 87, 0, 80, 32, 0, 11, 358, 385, 0, 0, 0, 0, 0, 0, 0, 109, 0, 25, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 10, 21, 0, 8, 0, 0, 43, 243, 244, 267, 0, 6…
$ nhpac   <dbl> 0, 0, 0, 21, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ nhother <dbl> 0, 0, 2, 6, 0, 233, 293, 0, 11, 49, 0, 57, 45, 13, 0, 0, 0, 0, 27, 0, 0, 20, 23, 0, 0, 25, 33, 0, 0, 52, 110, 15, 0, 0, 0, 108, 286, 157, 16, 14…
$ nhtwo   <dbl> 74, 154, 25, 56, 44, 95, 35, 124, 177, 251, 93, 55, 6, 165, 63, 9, 179, 51, 12, 180, 0, 47, 47, 11, 8, 9, 74, 42, 49, 187, 0, 147, 114, 78, 0, 7…
$ hisp    <dbl> 0, 26, 51, 30, 55, 233, 303, 42, 167, 469, 241, 165, 45, 251, 278, 43, 155, 215, 44, 26, 26, 30, 0, 35, 0, 0, 55, 0, 31, 153, 129, 72, 7, 0, 79,…

基本上我想概括下面的 mutate 命令,以便我可以换出新的变量名称、分子和分母,然后在我的数据框中为每个新变量返回一个新列,就像代码行一样下面就可以了。


 mutate(phisp = (hisp/racetot)*100)

使用上面的 mutate 手动创建百分比变量需要大量的复制 + 粘贴,我正在尝试使用函数来简化代码。所以,我决定创建一个名为“percenter”的函数(我知道,我稍后会重命名它):

percenter <- function(data, x) {
   
  varname <- paste0("p", x) 
  
  data <- data %>%
    mutate({{varname}} := (x/racetot)*100)
  
}

percents <- percenter(data = percents, x = percents$hisp)

但是,它会引发以下错误:

paste0("p", n) 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量

我认为问题在于它将粘贴函数应用于数据框中的每个变量。我只希望它应用于我尝试为其创建百分比的变量。

还有其他人对如何做到这一点有更好的想法吗?也许使用 vapply 或 map_df?

最终目标是创建一个函数,该函数可以将数据帧中的变量向量作为输入,并迭代数据帧各列中的值,以根据分子和分母的输入创建百分比变量。

因此,作为西班牙变量的示例,我想创建一个等于 (hisp/racetot)*100 的新变量“phisp”。我上面写的函数试图创建一个新的变量名,它只是在我在分子中使用的变量前面粘贴一个“p”。在上面的这个子集数据框中,我需要为来自 nhwht:hisp 的每个变量创建百分比,使用 racetot 作为基础。接下来我需要转向教育或收入变量,但我正在尝试首先为种族变量制定一个函数。

任何帮助将不胜感激。

【问题讨论】:

    标签: r dataframe function tidyverse dplyr


    【解决方案1】:

    在我发帖几个小时后,我想出了一个可行的解决方案。下面是代码和返回的数据框:

    test <- percents %>%
      mutate_at( c("hisp", "nhwht", "nhblk", "racetot"),
        funs(p = (./racetot)*100))
    
    
    Rows: 146,112
    Columns: 17
    $ tractid   <chr> "01001020100", "01001020100", "01001020200", "01001020200", "01001020300", "01001020300", "01001020400", "01001020400", "01001020500", "010010…
    $ year      <chr> "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019", "2013", "2019"…
    $ pop       <dbl> 1808, 1993, 2355, 1959, 3057, 3507, 4403, 3878, 10851, 10596, 3408, 3668, 2744, 3586, 3310, 3196, 10182, 11142, 5844, 6143, 3390, 2527, 3555, …
    $ racetot   <dbl> 1808, 1993, 2355, 1959, 3057, 3507, 4403, 3878, 10851, 10596, 3408, 3668, 2744, 3586, 3310, 3196, 10182, 11142, 5844, 6143, 3390, 2527, 3555, …
    $ nhtot     <dbl> 1808, 1967, 2304, 1929, 3002, 3274, 4100, 3836, 10684, 10127, 3167, 3503, 2699, 3335, 3032, 3153, 10027, 10927, 5800, 6117, 3364, 2497, 3555, …
    $ nhwht     <dbl> 1576, 1685, 776, 759, 2359, 2285, 3923, 3495, 8500, 7982, 2885, 2863, 2219, 2658, 2951, 2751, 9027, 9375, 5248, 5250, 2423, 1942, 1110, 1482, …
    $ nhblk     <dbl> 148, 152, 1465, 1117, 559, 857, 130, 216, 1766, 1929, 430, 693, 474, 730, 275, 436, 976, 1607, 529, 625, 949, 516, 2375, 1660, 768, 378, 284, …
    $ nhnat     <dbl> 10, 0, 0, 0, 15, 0, 22, 32, 39, 0, 0, 0, 0, 20, 21, 0, 0, 0, 28, 63, 3, 2, 0, 23, 112, 171, 27, 75, 74, 245, 98, 70, 32, 19, 0, 7, 32, 28, 0, …
    $ nhasian   <dbl> 0, 2, 87, 0, 80, 32, 0, 11, 358, 385, 0, 0, 0, 0, 0, 0, 0, 109, 0, 25, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 10, 21, 0, 8, 0, 0, 43, 243, 244, 267, 0,…
    $ nhpac     <dbl> 0, 0, 0, 21, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
    $ nhother   <dbl> 0, 0, 2, 6, 0, 233, 293, 0, 11, 49, 0, 57, 45, 13, 0, 0, 0, 0, 27, 0, 0, 20, 23, 0, 0, 25, 33, 0, 0, 52, 110, 15, 0, 0, 0, 108, 286, 157, 16, …
    $ nhtwo     <dbl> 74, 154, 25, 56, 44, 95, 35, 124, 177, 251, 93, 55, 6, 165, 63, 9, 179, 51, 12, 180, 0, 47, 47, 11, 8, 9, 74, 42, 49, 187, 0, 147, 114, 78, 0,…
    $ hisp      <dbl> 0, 26, 51, 30, 55, 233, 303, 42, 167, 469, 241, 165, 45, 251, 278, 43, 155, 215, 44, 26, 26, 30, 0, 35, 0, 0, 55, 0, 31, 153, 129, 72, 7, 0, 7…
    $ hisp_p    <dbl> 0.0000000, 1.3045660, 2.1656051, 1.5313936, 1.7991495, 6.6438551, 6.8816716, 1.0830325, 1.5390287, 4.4261986, 7.0715962, 4.4983642, 1.6399417,…
    $ nhwht_p   <dbl> 87.16814, 84.54591, 32.95117, 38.74426, 77.16716, 65.15540, 89.09834, 90.12378, 78.33379, 75.33031, 84.65376, 78.05344, 80.86735, 74.12158, 89…
    $ nhblk_p   <dbl> 8.185841, 7.626693, 62.208068, 57.018887, 18.285901, 24.436841, 2.952532, 5.569881, 16.274998, 18.204983, 12.617371, 18.893130, 17.274052, 20.…
    $ racetot_p <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10…
    
    

    这使用mutate_at 函数创建一个后缀为“_p”的新变量,该变量获取指定向量中的每个变量并除以racetot。

    我想将“p”放在开头并删除后缀并使用across 进行调整,但我现在已经花了足够的时间。任何调整都将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 2020-11-10
      • 2016-09-07
      • 2022-12-09
      • 2013-01-14
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多