我有一个非常大的数据集,我根据其中一个因素分解成较小的数据框:状态。不幸的是,对于某些州,我的数据非常少(例如阿拉斯加州)。当我在较小的数据框架上运行我的基本模型时,我会遇到其中一个因素的问题(性别变量只是' M' F')。
我使用循环来设置每个状态的数据帧。我正在计划构建一个if语句,如果它没有1级因子,它只会运行模型。但我不知道如何构建它。
states_list<-c("AK", ... "WY") # shortened for brevity
resultsList<-list()
j<-1
for (i in states_list){
temp_data<-raw[raw$state==i,]
fac <- min(factor(temp_data) # <- Part I don't have right
if(fac > 1){
model<-lm(y_var~gender,data=temp_data)
resultsList[[j]]<-summary(model)
} else {
print(i)
print("doesn't have enough data points")
}
j=j+1
}
由于 -W
答案 0 :(得分:1)
您不需要使用for循环,我强烈建议您使用library(dplyr)
library(broom)
# example dataframe
dt = data.frame(state = c(rep("AA",20), rep("BB",15)),
gender = c(rep("M",10), rep("F",10), rep("M",15)),
value = rnorm(35, 100, 5), stringsAsFactors = F)
dt %>%
group_by(state) %>% # for each state
mutate(NumUniqueGenders = n_distinct(gender)) %>% # count how many unique values of gender you have (and add it for each row)
filter(NumUniqueGenders == 2) %>% # keep only rows the belong to a state with both M and F
do(tidy(lm(value ~ gender, data=.))) %>% # run model and save output as a dataframe
ungroup # forget the grouping
# # A tibble: 2 x 6
# state term estimate std.error statistic p.value
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 AA (Intercept) 99.9643476 1.092526 91.4983355 1.787784e-25
# 2 AA genderM 0.6236803 1.545066 0.4036594 6.912182e-01
包将模型输出保存为数据框,以便您可以访问所需的任何值。
{{1}}
因此,最终您将得到一个每个状态有2行的数据帧。一个用于拦截,一个用于性别。