【问题标题】:conditional statements in data.tabledata.table 中的条件语句
【发布时间】:2013-06-10 07:11:11
【问题描述】:

我正在尝试使用条件语句来获取数据表中的一些变量。这是一些简化的数据、代码和结果:

> 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”和“win”,即它们显示为 V2 和 V3。我做错了什么?

【问题讨论】:

  • 附注:1 * (nchar(bet) > 2.5) 是表达第一个 if 语句的更短方式,1 * grepl(outcome, bet) 是表达第二个 if 语句的等效方式。
  • 我猜 if 语句之所以起作用,只是因为 id 和 trial 确定了一个唯一的行。此外,您可以避免计算 nchar 两次...{nbet=nchar(bet);list(nbet=nbet,riskybet=1*(nbet>2),win=1*grepl(outcome,bet))}

标签: r data.table


【解决方案1】:

您正在为 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

【讨论】:

  • @AlexR 在这种特殊情况下,我更喜欢使用0 + (nchar(bet)>2.5)as.numeric(nchar(bet)>2.5),而不是if/else;或者更好的是,只需将其保留为布尔值,您所做的任何数字运算都会在以后自动转换为所需的 0/1
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多