R中一级因子的检验

R中一级因子的检验,r,dataframe,factors,R,Dataframe,Factors,我有一个非常大的数据集,我根据其中一个因素将其分解为更小的数据帧:状态。不幸的是,对于一些州,我几乎没有数据(例如阿拉斯加)。当我在较小的数据帧上运行我的基本模型时,我会遇到其中一个因素的问题(一个只有'M'或'F'的性别变量) 我使用循环来设置每个状态的数据帧。我计划构建一个if语句,该语句只在没有1级因子的情况下运行模型。但我不知道如何构建它 states_list<-c("AK", ... "WY") # shortened for brevity resultsList<-l

我有一个非常大的数据集,我根据其中一个因素将其分解为更小的数据帧:状态。不幸的是,对于一些州,我几乎没有数据(例如阿拉斯加)。当我在较小的数据帧上运行我的基本模型时,我会遇到其中一个因素的问题(一个只有'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
}

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=))%%>%
?是的,您是对的,因为命令使用了
数据=。
所以不需要
$