2016-08-05 34 views
0

我是R新手。我已经找到了我的问题的答案,但没有找到适合我的任何东西。R ifelse多于真正的节中的命令/ ifelse当它真的是真时返回False

我有以下data.table:

data2 <- fread("file.txt", header = T, sep= "|", quote = "^" stringsAsFactors=FALSE); 

Accounts_filed_date Incorporation_Date 
     2015-08-25   1863-05-01 
     2016-06-28   1863-07-16  
     2016-06-29   1863-12-29 
     2015-12-10   1880-08-17 

Y <- function(incorporation_date, accounts_filled_date) 
{timee <-Sys.Date()-incorporation_date;timee <- as.numeric(timee); 
    if(timee/365 <2){y=0; return(y)} 
    else{x <- as.Date(format(accounts_filled_date, "%2016-%m-%d")); 
    + x <- Sys.Date()- x; 
    + x <- as.numeric(x); 
    + if(x<274) {y <-timee/365; return(pmax(pmin(y,5),0))} 
    + else{y<-timee/365-1; return(pmax(pmin(y,5),0))}}} 

data2[, c("Y") := Y(Incorporation_Date, Accounts_filed_date), with = FALSE] 

然而,这并不工作,因为incorporation_date和accounts_filled_date是矢量。

我已经试过ifelse但用下面的代码:

Y <- function(incorporation_date, accounts_filled_date) 
{timee <- Sys.Date()-incorporation_date;timee <- as.numeric(timee); 
timee<- timee/365; 
ifelse(timee<2,y=0, 
     x<-as.Date(format(accounts_filled_date, "%2016-%m-%d")); 
     x <-Sys.Date()- x; 
     x <- as.numeric(x); 
     ifelse(x<274,y <-timee, y<- timee-1)); 
return(pmax(pmin(y,5),0))} 

其返回如下:

Error: unexpected ';' in "Y <- function(incorporation_date, accounts_filled_date) {timee <- Sys.Date()-incorporation_date;timee <- as.numeric(timee); timee <- timee/365;ifelse(timee<2,y=0,x 

基本上,我的问题是: 我如何可以包括多个动作ifelse声明中的'虚假'部分?

UPDATE

Y <- function(incorporation_date, accounts_filled_date) 
{timee <- Sys.Date()-incorporation_date;timee <- as.numeric(timee); 
timee2<- timee/365; 
timee2 <- as.integer(timee2); 
x<-as.Date(format(accounts_filled_date, "%2016-%m-%d")); 
    x <- Sys.Date()- x; 
    x <- as.numeric(x); 
ifelse**(timee2 <= 2,** y<-0, ifelse(x<274,y <-timee2, y<- timee2-1)); 
return(pmax(pmin(y,100),0))} 

这工作,除了时间< = 2,位。我已经重复检查 - 它返回的值小于2,只是逻辑返回FALSE。有什么建议么?

+1

你为什么用分号(;)和加号(+)?这些在基数R中很少(如果有的话)是必需的。 – lmo

+0

这不是执行多个动作的唯一方法吗? + s是由保存在.txt文件中的一些代码引起的。 –

+1

在需要的情况下,将代码块包装在“{}”中是一个好方法。但是,在我看来,您的编码逻辑需要重新编制。首先,无论您的情况如何,都会创建x('timee <2')。这应该会大大简化您的问题。其次,在'ifelse'中使用赋值很奇怪,可能是不必要的:'ifelse(x <274,y <-timee,y < - timee-1)'应该看起来更像'y < - ifelse(x <274,timee ,timee-1))',甚至可能是'y < - timee - (x <274)',这会更快。 – lmo

回答

0

重新排列声明捕获逻辑:

Y <- function(incorporation_date, accounts_filed_date) 
{timee <- Sys.Date()-incorporation_date;timee <- as.numeric(timee); 
    timee2<- timee/365; 
    x<-as.Date(format(accounts_filed_date, "%2016-%m-%d")); 
    x <- Sys.Date()- x; 
    x <- as.numeric(x); 
    y <- ifelse(timee2 <= 2, 0,ifelse(x < 274, timee2, timee2-1)); 
    return(pmax(pmin(y,5),0))}