【问题标题】:lag function in ifelseifelse 中的滞后函数
【发布时间】:2017-01-05 10:19:06
【问题描述】:

我有一个结构如下的数据框 df:

val1 val2 val3
1    12   NA
2    14   NA
3    54   54
1    35   4
2    3    5
3    7    NA
4    8    NA
5    9    NA

预期值:

val1 val2 val3  val4
1    12   NA    12
2    14   NA    12
3    54   54    54
1    35   4     35
2    3    5     3
3    7    NA    3
4    8    NA    3
5    9    NA    3

问题:

我需要一个具有以下条件的新列 val4

df$val4 <- ifelse(df$val1 == 1, df$val2, ifelse(is.na(df$val3), lag(df$val4), df$val2))

这导致

Error in hasTsp(x) : attempt to set an attribute on NULL

条件:

  • val1 等于 1 时,val4 等于 val2 的值(val3 无关紧要)
  • val3 为 NA 时,val4 等于前一个值(预计 val1 不等于 1 时)

P.S:我知道我可以在这里使用 for 循环,但这会很慢!

【问题讨论】:

  • 您是否更改了预期的输出?现在哪一个是正确的?
  • 只需df$val4 &lt;- zoo::na.locf(ifelse(df$val1 != 1 &amp; is.na(df$val3), NA, df$val2))

标签: r dataframe


【解决方案1】:

我们可以使用data.tablezoo。将 'data.frame' 转换为 'data.table' (setDT(df)),通过将 'val2' 与 1 和 NA 的向量相乘来创建 'val4' (NA^is.na(val3) - 为 'val3 中的 NA 元素返回 NA ' 而非 NA 更改为 1),然后对于 'val1' 中的 1,我们将 'val4' 分配给 'val2',并将 NA 元素替换为之前的非 NA 元素为 na.locf

library(data.table)
library(zoo)
setDT(df)[, val4 := val2 * NA^is.na(val3)
         ][val1==1, val4 := val2
          ][, val4 := na.locf(val4)][]
#   val1 val2 val3 val4
#1:    1   12   NA   12
#2:    2   14   NA   12
#3:    3   54   54   54
#4:    1   35    4   35
#5:    2    3    5    3
#6:    3    7   NA    3
#7:    4    8   NA    3
#8:    5    9   NA    3

更多代码说明

`is.na` returns a `logical` vector

setDT(df)[, is.na(val3)]
#[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

如果我们需要将 TRUE 值更改为 NA 并将 1 更改为其他值

setDT(df)[, NA^is.na(val3)]
#[1] NA NA  1  1  1 NA NA NA

乘以'val2'

setDT(df)[, val2 * NA^is.na(val3)]
#[1] NA NA 54 35  3 NA NA NA

剩下的只是根据'i'中的逻辑条件赋值

数据

df <- structure(list(val1 = c(1L, 2L, 3L, 1L, 2L, 3L, 4L, 5L), val2 = c(12L, 
14L, 54L, 35L, 3L, 7L, 8L, 9L), val3 = c(NA, NA, 54L, 4L, 5L, 
NA, NA, NA)), .Names = c("val1", "val2", "val3"), class = "data.frame", 
row.names = c(NA, -8L))

【讨论】:

  • @user3875610 有了新的预期输出,它给出了不同的值。
  • 是的,对于前几个值,它给出了正确的输出,我很兴奋写了评论,如果尝试调整代码看看,还是谢谢
  • 感谢您的尝试,但这就是我得到的:1:在 Ops.factor(val2, NA^(!(!is.na(val3)))) 中:'*' 对因子没有意义并强制用于 val3
  • @user3875610 我的帖子中的新更新得到了预期的输出
  • 你能解释一下这部分吗:“val2 * NA^!!is.na(val3)”
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多