我有一个包含2列的数据帧
df <- structure(list(days = 1:10, days_fs = c(NA, NA, NA, NA, NA, 1,
NA, NA, NA, NA)), row.names = c(NA, -10L), class = "data.frame")
df$days_fs中的数字"1"只是一个标记,其位置将随着用户输入的变化而变化。我需要的是从这个"1"的位置填充到这个向量的末尾,然后从一开始就继续这样:
df2 = structure(list(days = c(6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L,
5L), days_fs = 1:10), class = "data.frame", row.names = c(NA,
-10L))
好吧,我知道我可以手动制作两个向量,并使用基数R来用之类的东西填充这一列
df$days_fs[which(df$days_fs == 1):nrow(df)] <- seq(1,5)
等等。然后使用dplyr::arrange。
必须有一种更有效(可读(的方法来在tidyverse概念中实现这一点。建议?
我们可以使用
library(dplyr)
df %>%
arrange(desc(cumsum(!is.na(days_fs)))) %>%
mutate(days_fs = row_number())
-输出
# days days_fs
#1 6 1
#2 7 2
#3 8 3
#4 9 4
#5 10 5
#6 1 6
#7 2 7
#8 3 8
#9 4 9
#10 5 10
或base R
中的相同逻辑
transform(df[order(-cumsum(!is.na(df$days_fs))),], days_fs = seq_len(nrow(df)))
另一个基本R选项
transform(
df,
days = unlist(split(seq_along(days_fs), rev(cumsum(!is.na(days_fs))))),
days_fs = seq_along(days)
)
给出
days days_fs
1 6 1
2 7 2
3 8 3
4 9 4
5 10 5
6 1 6
7 2 7
8 3 8
9 4 9
10 5 10