R中一级因子的检验
我有一个非常大的数据集,我根据其中一个因素将其分解为更小的数据帧:状态。不幸的是,对于一些州,我几乎没有数据(例如阿拉斯加)。当我在较小的数据帧上运行我的基本模型时,我会遇到其中一个因素的问题(一个只有'M'或'F'的性别变量) 我使用循环来设置每个状态的数据帧。我计划构建一个if语句,该语句只在没有1级因子的情况下运行模型。但我不知道如何构建它R中一级因子的检验,r,dataframe,factors,R,Dataframe,Factors,我有一个非常大的数据集,我根据其中一个因素将其分解为更小的数据帧:状态。不幸的是,对于一些州,我几乎没有数据(例如阿拉斯加)。当我在较小的数据帧上运行我的基本模型时,我会遇到其中一个因素的问题(一个只有'M'或'F'的性别变量) 我使用循环来设置每个状态的数据帧。我计划构建一个if语句,该语句只在没有1级因子的情况下运行模型。但我不知道如何构建它 states_list<-c("AK", ... "WY") # shortened for brevity resultsList<-l
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
}
states\u list您不需要使用for循环,我强烈建议使用broom
包将模型输出保存为数据帧,这样您就可以访问所需的任何值
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
库(dplyr)
图书馆(扫帚)
#示例数据帧
dt=数据帧(状态=c(代表(“AA”,20),代表(“BB”,15)),
性别=c(代表(“M”,10),代表(“F”,10),代表(“M”,15)),
值=rnorm(35,100,5),StringsAsAsFactors=F)
dt%>%
按(州)分组%>%#每个州
mutate(numiniquegenders=n_distinct(gender))%>%#计算您有多少个唯一的性别值(并为每行添加)
筛选器(NumUniqueGenders==2)%>%#仅保留属于同时具有M和F的状态的行
do(tidy(lm(value~gender,data=))%>%#运行模型并将输出保存为数据帧
取消分组#忘记分组
##A tibble:2 x 6
#状态项估计标准误差统计p值
#
#1 AA(截距)99.9643476 1.092526 91.4983355 1.787784e-25
#2 AA genderM 0.6236803 1.545066 0.4036594 6.912182e-01
因此,最终您将得到一个数据帧,每个状态有2行。一个用于拦截,一个用于性别 if(长度(级别(钻石$cut))>1)
仅当diamonds
中的cut
列具有多个因子级别时,才会返回TRUE。这就是你想要实现的吗?是的,我想可以。让我来测试一下。您可能想使用state.abb
而不是重写它。@Florian我现在遇到了这个错误:sort.list中的错误(y):“x”必须是“sort.list”的原子形式。您在列表中调用过“sort”吗?Calls:factor->sort.list看起来您想要的是fac,很抱歉有点吹毛求疵,但是do行应该是do(tidy(lm(y_var~gender,data=))%%>%
?是的,您是对的,因为命令使用了数据=。
所以不需要$
。