我有一个如下所示的数据集:
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
答案 0 :(得分:1)
使用 sapply
和 tapply
,您可以:
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_wider
将poverty_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)