【问题标题】:How can I create a prop.table from a dataset with multiple variables?如何从具有多个变量的数据集创建 prop.table?
【发布时间】:2021-06-13 12:46:19
【问题描述】:

我有一个如下所示的数据集:

YEAR    ID_HOUSEHOLD  Size  n_fem n_male   n_Sec_Edu  n_High_Edu  n_emp n_noemp n_stud poverty_t
2017         320        5      2      3       0           0         1      1       3      -1
2017         300        1      1      0       0           0         0      1       1      2
2017         150        6      3      3       4           1         2      1       4      1
2017         170        3      3      1       2           1         2      0       0      0
2017         420        4      2      2       0           4         2      0       2      -1
2017         430        2      1      1       0           2         2      0       2      0

从这个表中,我想创建一个道具表,根据最后一个变量的类型来说明所有变量的比例。我想按行获取比例,即第一行应该说明样本中女性的比例分布在 -1、1、0 和 2 组中。

对于第一行,我将总结 n_female=12 (2+1+3+3+2+1) 的值。然后将每个类别的值相加并除以总数:

             -1             1            0            2 
       
n_female  (4/12)0.33   (3/12)0.25   (4/12)0.33   (1/12)0.083
n_male      
n_sec_edu   
n_high_edu  
n_emp       
n_noemp     
n_stu       

【问题讨论】:

  • 您能否在该表中填写更多数据以显示您想要的内容?
  • 我已经编辑了这个问题,但总的来说我想按列查找每行的比例。我不知道如何总结第一个数据集的每一列的值,以根据最后一个变量按列分配它们并获得比例。
  • 你是如何进行计算的?你能解释一下第一行的计算吗?
  • 我已经编辑了第一行。基本上,我会总结 n_female=12 (2+1+3+3+2+1) 的值。然后将每个类别的值相加,然后除以总数。我不知道如何使用 R 中更大的数据集来做到这一点

标签: r


【解决方案1】:

使用sapplytapply 你可以:

cols <- 4:10
t(sapply(df[cols], function(x) tapply(x, df$poverty_t, sum)/sum(x)))

#                  -1         0         1          2
#n_fem      0.3333333 0.3333333 0.2500000 0.08333333
#n_male     0.5000000 0.2000000 0.3000000 0.00000000
#n_Sec_Edu  0.0000000 0.3333333 0.6666667 0.00000000
#n_High_Edu 0.5000000 0.3750000 0.1250000 0.00000000
#n_emp      0.3333333 0.4444444 0.2222222 0.00000000
#n_noemp    0.3333333 0.0000000 0.3333333 0.33333333
#n_stud     0.4166667 0.1666667 0.3333333 0.08333333

【讨论】:

    【解决方案2】:

    这是一个基于整洁的方法:

    
    library(tibble)
    
    dat %>%
        select( -YEAR, -ID_HOUSEHOLD, -Size ) %>%
        pivot_longer( !poverty_t ) %>%
        pivot_wider( names_from=poverty_t, values_from=value, values_fn=sum ) %>%
        column_to_rownames("name") %>%
        mutate( rs = rowSums(.) ) %>%
        mutate_at( vars(!rs),  ~ ./rs ) %>%
        select( -rs )
    
    

    诀窍是首先pivot_longer 将值整齐地排列在一个列中,然后pivot_widerpoverty_t 数据作为列显示出来,然后对这些数据进行rowSum 归一化。

    【讨论】:

      【解决方案3】:

      这是一个漫长而多风的 dplyr 和看门人方法。

      library(dplyr)
      library(janitor)
      
      dat <- read.table(textConnection("YEAR    ID_HOUSEHOLD  Size  n_fem n_male   n_Sec_Edu  n_High_Edu  n_emp n_noemp n_stud poverty_t
      2017         320        5      2      3       0           0         1      1       3      -1
      2017         300        1      1      0       0           0         0      1       1      2
      2017         150        6      3      3       4           1         2      1       4      1
      2017         170        3      3      1       2           1         2      0       0      0
      2017         420        4      2      2       0           4         2      0       2      -1
      2017         430        2      1      1       0           2         2      0       2      0
      "), stringsAsFactors=FALSE
      )
      
      
      
      colnames(dat) <- dat[1,]
      dat <- dat[-1,]
      d <- dat %>% 
        mutate(poverty_t = as.factor(poverty_t)) %>% 
        mutate_at(vars(starts_with("n")),function(x) as.numeric(as.character(x))) %>% 
        group_by(poverty_t) %>% 
        summarize(n_fem = sum(n_fem),
                  n_male = sum(n_male),
                  n_Sec_Edu = sum(n_Sec_Edu),
                  n_High_Edu = sum(n_High_Edu),
                  n_emp = sum(n_emp),
                  n_noemp = sum(n_noemp),
                  n_stud = sum(n_stud)) %>% 
        t() %>% 
        data.frame() 
      
      colnames(d) <- c("minus_one", "zero", "one", "two")
      d <- d[-1,]
      d$variable <- row.names(d)
      
      d2 <- d %>% 
        mutate_at(vars(minus_one:two),function(x) as.numeric(as.character(x))) %>% 
        adorn_percentages(,,minus_one:two) %>% 
        adorn_rounding(,,minus_one:two)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多