2017-02-03 43 views
1

我正在尝试使用其他列中的值根据另一列中的条件在数据框中添加一个字段。带多列的Sapply操作

df <- data.frame(condition= c("startBin>7 & startBin<=12 & endBin>25 & endBin<=30","(startBin<=7 | startBin>12) & (endBin<=25 | endBin>30)","(startBin>7 & startBin<=12) & (endBin<=25 | endBin>30)","(startBin<=7 | startBin>12) & endBin>25 & endBin<=30"), 
          startBin = c(1,1,1,1), endBin = c(26,26,26,26), exprTemp=c("One","Two","Three","Four")) 

如果满足“条件”列中的条件,我想创建一个值为1的“检查”列。因此,我想更新的数据帧为:

df <- data.frame(condition= c("startBin>7 & startBin<=12 & endBin>25 & endBin<=30","(startBin<=7 | startBin>12) & (endBin<=25 | endBin>30)","(startBin>7 & startBin<=12) & (endBin<=25 | endBin>30)","(startBin<=7 | startBin>12) & endBin>25 & endBin<=30"), 
          startBin = c(1,1,1,1), endBin = c(26,26,26,26), exprTemp=c("One","Two","Three","Four"), check=c(0,0,0,1)) 

注意查收的值为1,用于其条件为真的最后一个记录。

我试过如下:

df$check <- eval(parse(text=paste0("ifelse(",df$condition,",1, '')",sep="")),df) 

但作为EVAL评估只有最后一个条件,它返回检查= 1的所有行。

+1

这真的不清楚你想达到的目标。 – Haboryme

+0

更新时间了解更多详情 – Gaurav

+0

各行的条件不同。我想我必须使用字符串,因为这个脚本建立了一个软件用来估计模型的文件。 – Gaurav

回答

1

请试试这个代码:

df <- data.frame(startBin = c(1,1,1,1), endBin = c(26,26,26,26), exprTemp=c("One","Two","Three","Four")) 

condition= c("startBin>7 & startBin<=12 & endBin>25 & endBin<=30","(startBin<=7 | startBin>12) & (endBin<=25 | endBin>30)","(startBin>7 & startBin<=12) & (endBin<=25 | endBin>30)","(startBin<=7 | startBin>12) & endBin>25 & endBin<=30") 
parsedcond=(parse(text = condition)) 

newcol=logical(nrow(df)) 
for(i in 1:nrow(df)) 
newcol[i] <- with(df, eval(parsedcond[i]))[i] 

    df <- data.frame(df, newcol) 
> df 
    startBin endBin exprTemp newcol 
1  1  26  One FALSE 
2  1  26  Two FALSE 
3  1  26 Three FALSE 
4  1  26  Four TRUE 
+0

感谢您的解决方案。我尝试逐行进行,但速度太慢。我有几千条记录,通过记录进行记录是不现实的。 – Gaurav

+0

嗨,你有每行单一条件?条件重演吗? – Qbik

+0

重复条件。一些条件重复接近100次。 – Gaurav