【问题标题】:Creating counts for continuous variable to be grouped by another variable为连续变量创建计数以按另一个变量分组
【发布时间】:2022-08-04 11:15:24
【问题描述】:

我有一个 65000 行的数据集。为了解释的目的,这里是相同的一瞥。

state <- c(\"TX\", \"TX\", \"TX\", \"TX\", \"TX\", \"TX\", \"TX\", \"TX\", \"CA\", \"CA\", \"CA\", \"CA\", \"CA\", \"CA\", \"CA\", \"WI\", \"WI\", \"WI\", \"WI\", \"WI\")

centrac <- c(\"TX01\", \"TX02\", \"TX03\", \"TX04\", \"TX05\", \"TX06\", \"TX07\", \"TX08\", \"CA01\", \"CA02\", \"CA03\", \"CA04\", \"CA05\", \"CA06\", \"CA07\", \"WI01\", \"WI02\", \"WI03\", \"WI04\", \"WI05\")

pov <- c(48.00, 35.00, 7.04, 18.24, 28.45, 43.76, 3.91, 68.47, 5.29, 11.82, 27.89, 30.13, 17.63, 7.71, 3.45, 56.38, 2.17, 21.09, 23.56, 45.67)

df <- data.frame(state, centrac, pov)
print(df)

   state    centrac   pov
1     TX    TX01      48.00
2     TX    TX02      35.00
3     TX    TX03       7.04
4     TX    TX04      18.24
5     TX    TX05      28.45
6     TX    TX06      43.76
7     TX    TX07       3.91
8     TX    TX08      68.47
9     CA    CA01       5.29
10    CA    CA02      11.82
11    CA    CA03      27.89
12    CA    CA04      30.13
13    CA    CA05      17.63
14    CA    CA06       7.71
15    CA    CA07       3.45
16    WI    WI01      56.38
17    WI    WI02       2.17
18    WI    WI03      21.09
19    WI    WI04      23.56
20    WI    WI05      45.67

首先,我需要通过 5 个范围内的 pov 的计数来找出 centrac 的数量:

少于 10(极低贫困)

10-20(低贫困)

20-30(中等贫困)

30-40(高度贫困)

40 岁以上(极度贫困)

然后将这些计数按state 分组,得到下表:

Number of Census Tracts by Poverty

State     Very Low Poverty    Low Poverty   Medium Poverty   High Poverty   Very High Poverty
            (Less than 10)       (10-20)        (20-30)         (30-40)       (More than 40)
TX                2                 1             1                 1               3
CA                3                 2             1                 1               0
WI                1                 0             2                 0               2

我可以使用group_by 来获取state 排列的数据,但是我被困在第一部分。

非常感谢任何帮助!

    标签: r


    【解决方案1】:

    还是通过cut(),另一种取count(aggregate())的选项:

    state <- c("TX", "TX", "TX", "TX", "TX", "TX", "TX", "TX", "CA", "CA", "CA", "CA", "CA", "CA", "CA", "WI", "WI", "WI", "WI", "WI")
    
    centrac <- c("TX01", "TX02", "TX03", "TX04", "TX05", "TX06", "TX07", "TX08", "CA01", "CA02", "CA03", "CA04", "CA05", "CA06", "CA07", "WI01", "WI02", "WI03", "WI04", "WI05")
    
    pov <- c(48.00, 35.00, 7.04, 18.24, 28.45, 43.76, 3.91, 68.47, 5.29, 11.82, 27.89, 30.13, 17.63, 7.71, 3.45, 56.38, 2.17, 21.09, 23.56, 45.67)
    
    df <- data.frame(state, centrac, pov)
    
    cut_breaks = breaks = c(0,10,20,30,40,Inf)
    
    cut_labels = c("Very Low Poverty","Low Poverty","Medium Poverty","High Poverty","Very High Poverty")
    
    df$pov_cut = cut(df$pov,breaks = cut_breaks,labels = cut_labels, include.lowest = TRUE, right = FALSE)
    
    df_povCutCount = aggregate(x = list(pov_cut_count = df$pov),
                               by = list(pov_cut = df$pov_cut, state = df$state),
                               FUN = "length")
    
    head(df_povCutCount)
        
    #               pov_cut state pov_cut_count
    #    1 Very Low Poverty    CA             3
    #    2      Low Poverty    CA             2
    #    3   Medium Poverty    CA             1
    #    4     High Poverty    CA             1
    #    5 Very Low Poverty    TX             2
    #    6      Low Poverty    TX             1
    

    【讨论】:

    • 谢谢!当我将此代码用于实际数据并替换列名时,我收到一条错误消息Error in aggregate.data.frame(as.data.frame(x), ...) : no rows to aggregate
    • 谢谢你的cmets。我没有在函数aggregate()中为参数by = list()添加state = df$state,所以我修改了答案。也许您可以尝试用实际的变量名替换df$ 中涉及的所有参数?
    【解决方案2】:

    您可以使用 cut() 从连续变量创建 bin。

    df[["pov_level"]] <- cut(
      df$pov, 
      breaks = c(-Inf, 10, 20, 30, 40, Inf),
      labels = c(
        "Less than 10 (Very Low Poverty)",
        "10-20 (Low Poverty)",
        "20-30 (Medium Poverty)",
        "30-40 (High Poverty)",
        "More than 40 (Very High Poverty)"
      )
    )
    
    table(df$state, df$pov_level)
    #    Less than 10 (Very Low Poverty) 10-20 (Low Poverty) 20-30 (Medium Poverty)
    # CA                               3                   2                      1
    # TX                               2                   1                      1
    # WI                               1                   0                      2
    # 
    #    30-40 (High Poverty) More than 40 (Very High Poverty)
    # CA                    1                                0
    # TX                    1                                3
    # WI                    0                                2
    

    【讨论】:

    • 惊人的!在我的实际/更大数据集上使用代码时,我需要做的唯一更改是使用df[["pov_level"]] &lt;- cut( *df$pov*, breaks = ,否则我会收到错误消息,因为找不到对象。如果需要将这些数字转换为百分比,如何实现呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2011-07-10
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多