我的R函数中的逻辑总是返回" TRUE"

时间:2014-10-21 20:46:48

标签: r logic boolean-logic

我试图编写一个R函数来计算数据主体是否有资格根据其收入(X_INCOMG),其家庭规模(household从{ {1}}和CHILDREN)以及其家庭规模的联邦贫困限制(NUMADULT)。我使用了许多fpl_matrix语句来评估记录是否符合条件,但由于某种原因,我的代码将每个人都标记为合格,即使我知道这不是真的。别人可以看看我的代码吗?

请注意,变量if的编码表示收入类别(低于15000美元,25-35000等)。

#Create a sample data set

X_INCOMG

我知道这是很多要消化的代码,但我感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

我发现更容易让逻辑在函数之外运行良好,然后在函数运行良好后将其包装在函数中。我的下面代码就是这样做的。

我认为有一个问题是您将X_INCOMG的字面比较作为字符串(data$X_INCOMG[i]=='1')。该字段是示例代码中的数字,因此请删除引号。尝试使用X_INCOMG的编码因子。这将使您的代码以后更容易管理。

无需循环数据框中的每一行。

#put the poverty level data in a data frame for merging
fpl_2004.df<- as.data.frame(fpl_2004)
names(fpl_2004.df)<-c("household","pov.limit")
#Include cutoffs
fpl_2004.df$cutoff = 2.5 * fpl_2004.df$pov.limit

add_limit=3181

#compute household size (if NA's this will skip them)
sampdf$household = numeric(nrow(sampdf))
cc<-which(complete.cases(sampdf))
sampdf$household[cc] = sampdf$NUMADULT[cc] + sampdf$CHILDREN[cc]

#get max household and fill fpl_2004 frame
max.hh<-max(sampdf$household,na.rm=TRUE)
#get the 11 person poverty limit
fpl11=subset(fpl_2004.df,household==11)$pov.limit
#rows to fill out the data frame
append<-data.frame(household=12:max.hh,pov.limit=numeric(max.hh-12+1),
               cutoff=2.5 *(((12:max.hh)-11)*add_limit+fpl11))
fpl_2004.df<- rbind(fpl_2004.df,append)

#merge the two data frames
sampdf<- merge(sampdf,fpl_2004.df, by="household",all.x=TRUE)

#Add a logical variable to hold the eligibility                          
sampdf$elig <- logical(nrow(sampdf))
#compute eligibility
sampdf[!is.na(sampdf$X_INCOMG) & sampdf$X_INCOMG == 1,"elig"] = TRUE
sampdf[!is.na(sampdf$X_INCOMG) & sampdf$X_INCOMG == 9,"elig"] = TRUE
#for clarity define variable of what to subset
lvl2 <-!is.na(sampdf$X_INCOMG) & sampdf$X_INCOMG == 2
lvl2 <- lvl2 & !is.na(sampdf$cutoff) & sampdf$cutoff>=15000
#set the eligibility (note the initial value was false thus cutoff logic reversed)
sampdf[lvl2,"elig"] = TRUE

#continue computing these
lvl3 <-!is.na(sampdf$X_INCOMG) & sampdf$X_INCOMG == 3
lvl3 <- lvl3 & !is.na(sampdf$cutoff) & sampdf$cutoff>=25000
sampdf[lvl3,"elig"] = TRUE

或者,您可以使用截止比较值(15000; 25000; 35000等)和X_INCOMG加载一个小数据帧。然后由X_INCOMG合并,就像我对家庭大小一样,并将所有值设置为一个,如下所示。您可能需要再次使用complete.cases

sampdf$elig = sampdf$cutoff >= sampdf$comparison.value

对于任何不完整的案件,您将有elig == FALSE,需要进一步调查。