ifelse中的滞后函数

时间:2017-01-05 10:19:07

标签: r dataframe

我有一个数据帧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(val3无关紧要)时,
  • val4等于val2的值
  • 当val3为NA时,
  • val4等于先前的值(当val1不等于1时,则预期)

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

1 个答案:

答案 0 :(得分:1)

我们可以将data.tablezoo一起使用。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),创建&#39; val4&#39;通过乘以&#39; val2&#39;使用1和#的向量和NA(NA^is.na(val3) - 在&#39; val3&#39;中返回NA元素的NA,而将非NA更改为1),然后在&#39中返回1 ; val1&#39;,我们分配&#39; val4&#39;到&#39; val2&#39;,并将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

乘以&#39; val2&#39;

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

其余的只是基于&#39; i&#39;

中的逻辑条件进行分配

数据

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))