R,用于填充单元格的嵌套条件

时间:2018-09-05 16:35:16

标签: r

我在任何地方都找不到任何解决方案。

这是我的数据框:

A    B   
5.6  0
2.4  3
5.7  2 
8.1  1
6.3  0
3.5  3
2.5  2
1.3  1
7.8  0

我需要这样排列:

A    B   C    D     
5.6  0
2.4  3   5.7  8.1 
5.7  2 
8.1  1
6.3  0
3.5  3   2.5  1.3
2.5  2
1.3  1
7.8  0

我想创建C,D和E列。 如果B = 3,则C应该在下一行的A列中具有值。 如果B = 3,则D在第二行的A列中具有该值。

我用滞后变量进行了尝试 df$lag3 = c(rep(NA, 3), df$dist[1:(length(df$dist)-3)]) 但我失败了

2 个答案:

答案 0 :(得分:0)

注意-解决方案取决于行的顺序(没有任何类型的索引变量),因此使用这种类型的操作时应格外小心。

解决方案:

library(dplyr)

dat %>% 
  mutate(C = ifelse(B == 3, lead(A, order_by = row_number()), NA),
         D = ifelse(B == 3, lead(A, n = 2, order_by = row_number()), NA))

    A B   C   D
1 5.6 0  NA  NA
2 2.4 3 5.7 8.1
3 5.7 2  NA  NA
4 8.1 1  NA  NA
5 6.3 0  NA  NA
6 3.5 3 2.5 1.3
7 2.5 2  NA  NA
8 1.3 1  NA  NA
9 7.8 0  NA  NA

数据:

dat <- structure(list(A = c(5.6, 2.4, 5.7, 8.1, 6.3, 3.5, 2.5, 1.3, 
                            7.8), B = c(0L, 3L, 2L, 1L, 0L, 3L, 2L, 1L, 0L)), .Names = c("A", 
                                                                                         "B"), row.names = c(NA, -9L), class = c("data.frame"
                                                                                         ))

答案 1 :(得分:0)

这里是不使用库的选项

df1 <- as.data.frame(do.call(rbind, lapply(seq_along(df1$A), function(x) c(df1[x,], if(df1$B[x] == 3) c(df1$A[x + 1], df1$A[x + 2]) else c(NA, NA)))))

colnames(df1)[c(3, 4)] <- c("C", "D")

> df1
    A B   C   D
1 5.6 0  NA  NA
2 2.4 3 5.7 8.1
3 5.7 2  NA  NA
4 8.1 1  NA  NA
5 6.3 0  NA  NA
6 3.5 3 2.5 1.3
7 2.5 2  NA  NA
8 1.3 1  NA  NA
9 7.8 0  NA  NA