我有一个数据帧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
条件:
P.S:我知道我可以在这里使用循环,但那会非常慢!
答案 0 :(得分:1)
我们可以将data.table
与zoo
一起使用。转换&#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))