2016-08-05 2 views
0

나는 R에 처음이다. 나는 나의 질문에 응답을 찾았지만, 저에게 효과있는 것을 찾지 못했습니다.진실한 단면도/ifelse에있는 명령 이상 ifelse 실제로 TRUE 인 경우에 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 (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))} 
관련 문제