我在任何地方都找不到任何解决方案。
这是我的数据框:
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)])
但我失败了
答案 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