我是R的相对新手,我在5年期间有一系列人口普查区的社会经济分数(SES),我试图将每年的SES分数分为三类“高”, “中”和“低”,无需对数据进行子集化。
CT_ID_10 year SESindex SESindex_z SEStercile
1 42101009400 2012 11269.54 -1.0445502 NA
2 42101009400 2013 11633.63 -1.0256920 NA
3 42101009400 2014 15773.60 -0.8112616 NA
4 42101009400 2015 15177.28 -0.8421481 NA
5 42101009400 2016 21402.55 -0.5197089 NA
6 42101014000 2012 21448.06 -0.5173519 NA
我想使用平均值和标准偏差作为我的截止点(即高于平均值(x [每年])+ sd(x [每年])的任何东西都是“高”,而低于平均值的任何东西(x [每年]) - sd(x [每年])是“低”。我尝试了以下代码:
for (year in 2012:2016) {
df$SEStercile <- ifelse(df$SESindex_z[which(df$year==year)] > (mean(df$SESindex_z[which(df$year==year)])+sd(df$SESindex_z[which(df$year==year)])), "HIGH",
ifelse(df$SESindex_z[which(df$year==year)] < (mean(df$SESindex_z[which(df$year==year)])-sd(df$SESindex_z[which(df$year==year)])), "LOW","MEDIUM"))
}
但是,我收到以下错误:
Error in `$<-.data.frame`(`*tmp*`, "SEStercile", value = c("LOW", "LOW", :
replacement has 367 rows, data has 1839
非常感谢任何建议或简单的功能!
答案 0 :(得分:2)
此解决方案使用dplyr
。在这里,我使用随机数据创建一个数据框用于演示目的:
df <- data.frame(year = sample(2010:2018, 100, replace = TRUE),
z = runif(100))
接下来,我按年份分组并使用标准偏差作为休息时间。然后,我取消了由此产生的结果。
df %>%
group_by(year) %>%
mutate(category = cut(z,
breaks = c(-Inf, mean(z) - sd(z), mean(z) + sd(z), Inf),
labels = c("Low", "Medium", "High"))) %>%
ungroup
结果看起来像这样(例如2010年):
# # A tibble: 11 x 3
# year z category
# <int> <dbl> <fct>
# 1 2010 0.585 Medium
# 2 2010 0.951 High
# 3 2010 0.747 Medium
# 4 2010 0.802 Medium
# 5 2010 0.673 Medium
# 6 2010 0.662 Medium
# 7 2010 0.102 Low
# 8 2010 0.129 Low
# 9 2010 0.934 High
# 10 2010 0.270 Medium
# 11 2010 0.270 Medium
您的代码可能具体如下:
df %>%
group_by(year) %>%
mutate(SEStercile = cut(SESindex_z,
breaks = c(-Inf, mean(SESindex_z) - sd(SESindex_z), mean(SESindex_z) + sd(SESindex_z), Inf),
labels = c("Low", "Medium", "High"))) %>%
ungroup