R语言 创建分类收入变量

ltqd579y  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(185)

我有一个具有以下格式的 Dataframe :
| 识别码|收入情况|年份|
| - -|- -|- -|
| 一个|100个|二○ ○ ○年|
| 2个|二百|二○ ○ ○年|
| 三个|三百|二○ ○ ○年|
| 四个|五百个|二OO一年|
| 五个|千|二OO一年|
| 六个|一千五百|二OO一年|
| 七个|万|二OO二年|
| 八个|一万五千|二OO二年|
| 九个|二万|二OO二年|
我想添加一个名为income_cat的列,它有三个可能的级别;“低”、“中”和“高”,这取决于收入是在该特定年份的下33%、中33%还是上33%。
| 识别码|收入情况|年份|收入类别|
| - -|- -|- -|- -|
| 一个|100个|二○ ○ ○年|低的|
| 2个|二百|二○ ○ ○年|中等的|
| 三个|三百|二○ ○ ○年|高的|
| 四个|五百个|二OO一年|低的|
| 五个|千|二OO一年|中等的|
| 六个|一千五百|二OO一年|高的|
| 七个|万|二OO二年|低的|
| 八个|一万五千|二OO二年|中等的|
| 九个|二万|二OO二年|高的|
我很难找到合适的方法来做到这一点,并将非常感谢任何建议!

k97glaaz

k97glaaz1#

library(tidyverse) 

df %>%  
  group_by(Year) %>% 
  mutate(income_cat = case_when(Income > quantile(Income, 0.66) ~ "High", 
                                Income < quantile(Income, 0.33) ~ "Low", 
                                between(Income, 
                                        quantile(Income, 0.33),
                                        quantile(Income, 0.66)) ~ "Medium"))

# A tibble: 9 x 4
# Groups:   Year [3]
     ID Income  Year income_cat
  <dbl>  <dbl> <dbl> <chr>     
1     1    100  2000 Low       
2     2    200  2000 Medium    
3     3    300  2000 High      
4     4    500  2001 Low       
5     5   1000  2001 Medium    
6     6   1500  2001 High      
7     7  10000  2002 Low       
8     8  15000  2002 Medium    
9     9  20000  2002 High
p5fdfcr1

p5fdfcr12#

这是你的第一个问题,所以我将破例,但是stackoverflow社区通常要求一些东西来处理。换句话说,我们至少需要一些代码。否则,你只需要让其他人为你做工作。这应该对你的情况有效。

df$income_cat=as.factor(ifelse(df$Income<quantile(df$Income,0.33), 'low', 
                        ifelse(df$Income<quantile(df$Income,0.66), 'medium', 'high')))

请告诉我它是否有效。

odopli94

odopli943#

下面是一个使用data.table的答案。从玩具数据开始:

df <- data.table(id = 1:9, income = 100+100*(1:9), year = rep(2000+1:3, each = 3))

   id income year
1:  1    200 2001
2:  2    300 2001
3:  3    400 2001
4:  4    500 2002
5:  5    600 2002
6:  6    700 2002
7:  7    800 2003
8:  8    900 2003
9:  9   1000 2003

在对byyear进行分组时,我们可以使用data.table::fcase和包含在基数R中的quantile函数:
第一次

57hvy0tb

57hvy0tb4#

library(data.table)
library(magrittr)

df <- data.table(id = 1:9, income = 100+100*(1:9), year = rep(2000+1:3, each = 3))

df[, res := cut(
  x = income, 
  breaks = c(-Inf, quantile(x = income, probs = seq(0, 1, 1 /3))[2:3], +Inf),
  labels = c("Low", "Medium", "High")), by = year] %>%
  .[]
#>    id income year    res
#> 1:  1    200 2001    Low
#> 2:  2    300 2001 Medium
#> 3:  3    400 2001   High
#> 4:  4    500 2002    Low
#> 5:  5    600 2002 Medium
#> 6:  6    700 2002   High
#> 7:  7    800 2003    Low
#> 8:  8    900 2003 Medium
#> 9:  9   1000 2003   High

创建于2022年11月30日,使用reprex v2.0.2

u0njafvf

u0njafvf5#

我知道year是一个分组因子。这里是一个findInterval的版本。我已经尝试重新创建你的 Dataframe 的想法,并添加了一些随机数据点到每个组-见最后的数据。

library(dplyr)

df %>%
  group_by(year) %>%
  mutate(quantile = findInterval(income,
        quantile(income, probs=c(0.3, .66)))) |> 
  mutate(quantile = factor(quantile, labels = c("low", "medium", "high")))
#> # A tibble: 30 × 3
#> # Groups:   year [3]
#>    income  year quantile
#>     <int> <dbl> <fct>   
#>  1    258  2000 medium  
#>  2    278  2000 high    
#>  3    113  2000 low     
#>  4    294  2000 high    
#>  5    269  2000 medium  
#>  6    149  2000 low     
#>  7    217  2000 medium  
#>  8    142  2000 low     
#>  9    298  2000 high    
#> 10    297  2000 high    
#> # … with 20 more rows

数据

set.seed(123)
income <- c(sample(100:300, 10),
            sample(500:1500,10),
            sample(10000:20000, 10))
year <- c(rep(2000,10), rep(2001,10), rep(2002,10))

df <- data.frame(income, year)

相关问题