【问题标题】:looking for a more "data.table-ish" way to add a new column based on conditions from another寻找一种更“data.table-ish”的方式来根据另一个条件添加新列
【发布时间】:2015-01-10 18:40:15
【问题描述】:

我可以像这样添加一个条件列:

dt$newcol <- ifelse(dt4$doy > 150 & dt4$doy < 280, 1, 0)

将新列“newcol”添加到数据表“dt”中,如果 doy 大于 160 且小于 280,则用 1 填充 newcol,否则用 0 填充。

我一直在尝试习惯数据表的语法,我想知道如何使用 := 运算符以更数据表的风格做到这一点?

提前致谢

【问题讨论】:

  • 请考虑显示几行示例数据
  • 请澄清:doynewcol 位于不同的 data.table 中?
  • 同一个数据表,只是有一个名为“newcol”的新列,它使用来自列doy的条件。我将添加一些示例数据

标签: r data.table conditional-statements


【解决方案1】:

你可以试试

 library(data.table)
 dt4[,newcol:=(doy >150 & doy <280)+0L]
 head(dt4)
 #  doy         val newcol
 #1: 103 -1.35466363      0
 #2:  79 -0.96080882      0
 #3: 247  0.22495434      1
 #4: 182 -0.12316046      1
 #5: 232  0.00104102      1
 #6: 323 -0.57124325      0

或者您可以使用@Arun 评论的as.integer

 dt4[,newcol:= as.integer(doy>150 & doy < 280)]

数据

 set.seed(24)
 dt4 <- data.table(doy=sample(1:350, 150, replace=TRUE), val=rnorm(150) )

【讨论】:

  • 如果只需要输出为 1/0 或 TRUE/FALSE,如示例 (+1) 所示,这可能是最好的方法。
  • @beginneR 谢谢,但是,如果是 (0, 99),你可以multiply
  • 不错的 +1。考虑使用as.integer() 而不是+ 0 进行包装——不那么神秘。如果没有,那就做,+ 0L。前者强制转换为 numeric 类型,占用 8 字节的存储空间。
  • @Arun 谢谢,我会添加+0L
  • 完美! dt4[,newcol:= as.integer(doy>150 & doy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多