【问题标题】:Flag a row in one column based on past value in another column根据另一列中的过去值标记一列中的一行
【发布时间】:2015-11-19 02:19:56
【问题描述】:

可能是基本的,但我正在用头撞墙。

假设我有这个数据表:

library(data.table)
df <- data.frame(DaystoPeak = c(2,NA,NA,NA,NA,NA,3,NA,NA,NA,NA,NA), 
                 FlagPeak = c(0,0,1,0,0,0,0,0,0,1,0,0))

df <- data.table(df)

df
 #   DaystoPeak FlagPeak
 #1:          2        0
 #2:         NA        0
 #3:         NA        1
 #4:         NA        0
 #5:         NA        0
 #6:         NA        0
 #7:          3        0
 #8:         NA        0
 #9:         NA        0
 #10:        NA        1
 #11:        NA        0
 #12:        NA        0

基本上我想做的是生成第二列。 我正在尝试类似的东西:

df <- df[, FlagPeak := 0] 
df <- df[, FlagPeak[.I+2] := ifelse(DaystoPeak == 2, 1, FlagPeak)] 

但它不起作用......可能是循环引用问题或其他什么。我尝试了其他一些方法,但它们也不起作用:(

例如:

df <- df[, FlagPeak := ifelse(DaystoPeak == 2, c(0,0,1), FlagPeak)] 

有人可以帮忙吗?

【问题讨论】:

  • 在 RHS 上尝试 tailhead 功能。
  • 这样吗? flag &lt;- rep(0, nrow(df)); flag[which(!is.na(df$DaystoPeak)) + na.omit(df$DaystoPeak)] &lt;- 1
  • @rawr 谢谢你,效果很好!我想我也明白了。我对这一切都很陌生,所以接触这些东西是有帮助的。非常感谢!
  • 或在data.table 中发言 - df[which(!is.na(DaystoPeak)) + na.omit(DaystoPeak), FlagPeak := 1] - 顺便说一句,使用 := 时,您不需要像 df &lt;- ... 那样重新分配 - 它通过引用更新。
  • 我会做w = which(!is.na(df$DaystoPeak)); df[w+DaystoPeak[w], FlagPeak := 1L]。有一个针对 FlagPeak[.I+2] := 等语法的开放功能请求,我也希望看到。

标签: r indexing data.table


【解决方案1】:

我认为 cmets 有很多不错的选择。不过我可能会这样做:

df[, FlagPeak := 0][DaystoPeak + 1:.N, FlagPeak := 1]

这是有效的,因为df[NA, FlagPeak := 1] 什么都不做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2021-08-03
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多