【发布时间】: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