2013-06-10 5 views
2

데이터 테이블의 일부 변수를 얻기 위해 조건문을 사용하려고합니다. 그들은 V2와 V3로 표시 즉, 조건식, 그들은 정상적으로하지만 할당 된 변수 이름 'riskybet'과 '승리'없이 노력하고 있습니다data.table의 조건문

> dt 
    id trial bet outcome 
1: 11  1 1  6 
2: 11  2 456  2 
3: 11  3 3456  3 
4: 11  4 456  6 
5: 12  1 34  6 
6: 12  2 3456  2 
7: 12  3 12  4 
8: 12  4 123  2 

dt1=dt[,list(
nbet=nchar(bet), 
if (nchar(bet)>2.5) riskybet=1 else riskybet=0, 
if (grepl(outcome,bet)==TRUE) win=1 else win=0), 
by='id,trial'] 

> dt1 
    id trial nbet V2 V3 
1: 11  1 1 0 0 
2: 11  2 3 1 0 
3: 11  3 4 1 1 
4: 11  4 3 1 1 
5: 12  1 2 0 0 
6: 12  2 4 1 0 
7: 12  3 2 0 0 
8: 12  4 3 1 1 

: 다음은 몇 가지 간단한 데이터, 코드와 결과입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

사이드 코멘트 : '1 * (nchar (bet)> 2.5)'는 첫 번째 if 문을 표현하는 짧은 방법이고'1 * grepl (outcome, bet)'은 두 번째를 수행하는 동일한 방법입니다. – Dennis

+1

id 및 trial은 고유 한 행을 결정하기 때문에 if 문은 작동한다고 생각합니다. 또한, nchar을 두 번 계산하지 않아도됩니다. {nbet = nchar (bet); 목록 (nbet = nbet, riskybet = 1 * (nbet> 2), win = 1 * grepl (결과, 내기))} – Frank

답변

7

if/else-statement의 "inside"변수에 값을 할당합니다. 이 시도 :

dt1=dt[,list(
nbet=nchar(bet), 
riskybet = if (nchar(bet)>2.5) 1 else 0, 
win = if (grepl(outcome, bet)) 1 else 0), 
    by='id,trial'] 

    id trial nbet riskybet win 
1: 11  1 1  0 0 
2: 11  2 3  1 0 
3: 11  3 4  1 1 
4: 11  4 3  1 1 
5: 12  1 2  0 0 
6: 12  2 4  1 0 
7: 12  3 2  0 0 
8: 12  4 3  1 1 

은 또한 당신이 대신 기존의 if-elseifelse를 사용할 수 있습니다.

+0

훌륭 해요, 고맙습니다. – AlexR

+2

@AlexR이 특별한 경우에 'if + else'보다'0 + (nchar (bet)> 2.5)'또는'as.numeric (nchar (bet)> 2.5)'를 사용하는 것이 좋습니다. 또는 더 나은 아직, 그냥 부울로 남겨두고 모든 숫자 연산은 나중에 원하는 0/1로 자동으로 변환됩니다. – eddi