【问题标题】:creating dummy quantile variable from continuous variable从连续变量创建虚拟分位数变量
【发布时间】:2020-02-26 10:03:43
【问题描述】:

这是我正在处理的数据:

x <- getURL("https://raw.githubusercontent.com/dothemathonthatone/maps/master/testmain.csv")
    data <- read.csv(text = x)

我想为year_hh_inc 中的顶部、中间和底部三分之一的值创建一个虚拟变量。我的 id 列reg_schl 中的每个值都可能有多个year_hh_inc 的值,因此虚拟变量需要在reg_schl 上分组。 我希望能够在每个唯一的reg_schl 中区分year_hh_inc 中的值。

到目前为止,我有以下作为 Sotos 的解决方案发布在下面:

data %>% 
 group_by(reg_schl) %>%
 mutate(category = cut(year_hh_inc, breaks = (quantile(year_hh_inc, c(0, 1 / 3, 2 / 3, 1), na.rm = TRUE)), labels = c("low", "middle", "high"), include.lowest = TRUE), vals = 1) %>% 
 pivot_wider(names_from = category, values_from = vals, values_fill = list(vals = 0))

这很好用。

我也用过Allan提供的这个解决方案:

cut_by_id <- function(x)
{
  x$category <- cut(x$year_hh_inc, quantile(x$year_hh_inc, c(0,1/3,2/3,1), na.rm = TRUE), 
                    labels = c("low","middle","high"), include.lowest = TRUE)
  return(x)
}

data <- do.call(rbind, lapply(split(data, data$id), cut_by_id))

【问题讨论】:

  • 你能显示你的预期输出吗?

标签: r dummy-variable continuous


【解决方案1】:

您可以使用split - lapply - rbind 范式:

cut_by_id <- function(x)
{
  x$category <- cut(x$inc, quantile(x$inc, c(0,1/3,2/3,1), na.rm = TRUE), 
                    labels = c("low","middle","high"), include.lowest = TRUE)
  return(x)
}

data <- do.call(rbind, lapply(split(data, data$id), cut_by_id))

data
#>      id   inc fee fert fee_per_inc category
#> 1.1   1 11000 125 0.15 0.011363636      low
#> 1.2   1 15000 150 0.12 0.010000000      low
#> 1.3   1 17000 175 0.22 0.010294118   middle
#> 1.4   1 19000 200 0.13 0.010526316     high
#> 1.5   1 21000 225 0.12 0.010714286     high
#> 2.6   2 13000  55 0.11 0.004230769      low
#> 2.7   2 16000  75 0.09 0.004687500      low
#> 2.8   2 19000  85 0.23 0.004473684   middle
#> 2.9   2 21000  95 0.05 0.004523810     high
#> 2.10  2 25000 105 0.01 0.004200000     high
#> 3.11  3 18000  75 0.25 0.004166667      low
#> 3.12  3 21000  85 0.03 0.004047619      low
#> 3.13  3 23000  95 0.05 0.004130435   middle
#> 3.14  3 27000 105 0.15 0.003888889     high
#> 3.15  3 30000 115 0.25 0.003833333     high

box  <- boxplot(data$inc ~ data$category, col = 3:5)

reprex package (v0.3.0) 于 2020 年 2 月 26 日创建

【讨论】:

  • 感谢您的回答。我现在正在实施它,我有一个关于x$category &lt;- cut(x$fee, quantile(x$fee, c(0,1/3,2/3,1), na.rm = TRUE), 的问题我不明白为什么语法中涉及费用。我想削减inccolum 的低、中和高。这就是函数的作用吗?还是被fee 列值切割?我对 R 不流利,我可能在这里遗漏了明显的内容。
  • @MichaelPerdue 抱歉 - 应该是 inc
  • 有没有办法改变代码(在上面的例子中),使它不被id分组,即它在独立于@987654333的箱线图中显示inc的范围@.
  • @MichaelPerdue 如果您删除 labels= 它应该用数字范围标记组。如果您愿意,您可以设置自己的中断而不是使用分位数,然后根据这些中断标记它们。我可能会看到分位数是什么,然后选择附近的整数作为间隔,然后使用这些数字作为标签。
【解决方案2】:

我们可以根据分位数创建您的因子变量并传播这些值,即

library(dplyr)
library(tidyr)

data %>% 
 group_by(id) %>%
 mutate(category = cut(inc, breaks = (quantile(inc, c(0, 1 / 3, 2 / 3, 1), na.rm = TRUE)), labels = c("low", "middle", "high"), include.lowest = TRUE), vals = 1) %>% 
 pivot_wider(names_from = category, values_from = vals, values_fill = list(vals = 0))

给出,

# A tibble: 15 x 8
# Groups:   id [3]
      id   inc   fee  fert fee_per_inc   low middle  high
   <dbl> <dbl> <dbl> <dbl>       <dbl> <dbl>  <dbl> <dbl>
 1     1 11000   125  0.15     0.0114      1      0     0
 2     1 15000   150  0.12     0.01        1      0     0
 3     1 17000   175  0.22     0.0103      0      1     0
 4     1 19000   200  0.13     0.0105      0      0     1
 5     1 21000   225  0.12     0.0107      0      0     1
 6     2 13000    55  0.11     0.00423     1      0     0
 7     2 16000    75  0.09     0.00469     1      0     0
 8     2 19000    85  0.23     0.00447     0      1     0
 9     2 21000    95  0.05     0.00452     0      0     1
10     2 25000   105  0.01     0.0042      0      0     1
11     3 18000    75  0.25     0.00417     1      0     0
12     3 21000    85  0.03     0.00405     1      0     0
13     3 23000    95  0.05     0.00413     0      1     0
14     3 27000   105  0.15     0.00389     0      0     1
15     3 30000   115  0.25     0.00383     0      0     1

注意我在cut 中添加了参数include.lowest = TRUE 以便捕获第一个标签中的最小值(low

【讨论】:

  • 感谢您的回答。检查表格我发现inc 中的id == 1 中的所有值都没有标记在high 列中。我正在尝试为每个id 值分类低、中、高收入。
  • 哦,我错过了group_by(id) 之前的mutate...让我添加它
  • 有没有办法检查所有inc值是否都包含在lowmiddlehigh列中?
  • 我不确定你的意思
  • 是的,我认为最好隔离一个有问题的样本并分享它
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2011-03-24
  • 1970-01-01
  • 2022-10-14
  • 2021-07-25
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多