如何从具有多个变量的数据集创建 prop.table?

时间:2021-03-16 08:46:05

标签: r

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

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

从这个表中,我想创建一个 prop 表,它会根据最后一个变量的类型告诉所有变量的比例。我想按行获取比例,即第一行应该说明样本中女性在 -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       

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是一种基于 tidy 的方法:


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 对这些数据进行归一化。

答案 2 :(得分:0)

这是一个漫长而多风的 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)