R:填充列直到结束,然后从头开始



我有一个包含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

相关内容

最新更新