2013-06-10 7 views
2

Я пытаюсь использовать условные операторы для получения некоторых переменных в таблице данных. Вот некоторые упрощенные данные, код и результаты:условные операторы в 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 

условные операторы работают, как они должны, но без присвоенных имен переменного «riskybet» и «победы», то есть они появляются как V2 и V3. Что я делаю не так?

+1

Комментарий стороны: '1 * (nchar (bet)> 2.5)' - более короткий способ выражения вашего первого оператора if, а '1 * grepl (result, bet)' эквивалентный способ сделать второй. – Dennis

+1

Я предполагаю, что оператор if работает только потому, что id и trial определяют уникальную строку. Кроме того, вы можете избежать вычисления nchar дважды ... '{nbet = nchar (bet); list (nbet = nbet, riskybet = 1 * (nbet> 2), win = 1 * grepl (результат, ставка))}' – Frank

ответ

7

Вы присваиваете значения переменным «внутри» оператора if/else. Попробуйте это:

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 

В качестве альтернативы вы можете также использовать ifelse вместо традиционного if-else.

+0

отлично, спасибо. – AlexR

+2

@AlexR Мне нравится использовать '0 + (nchar (bet)> 2.5)' или 'as.numeric (nchar (bet)> 2.5)' лучше, чем 'if/else' в данном конкретном случае; или еще лучше, просто оставьте это как логическое, и любая цифровая операция, которую вы сделаете, автоматически преобразует в нужный 0/1 позже – eddi

Смежные вопросы