首页 > 解决方案 > 用数据帧中变量的可变长度数字序列替换 NA 时出错

问题描述

我有一个包含许多变量的数据框,但我只想关注一个“X”,如下所示:

df <- data.frame("x" = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", 1,"NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1))

我想要做的是以某种方式从 2 开始按顺序填充数字:

  1. 当有 x==1 时,下一个 NA 应该取 2、3、4 等等,直到再次 x==1 到达,然后下一个 NA 应该开始填充 2、3、4,等等。

示例输出:

x = 2,3,4,5,1,2,3,4,5,6,7,1,2,3,4,5,6,7,8,9,1,2,3,4,1,2,3,4,5,1 ......

我想做的是:

df$Sequence <- ifelse(df1$x!="1" & is.na(df1$x), seq(2,100), df1$x)

但这并没有返回我预期的输出,为什么?

标签: rloopsdplyrtidyverse

解决方案


由于x从 8 Continuous 开始,NA如何估算第一行仍然不清楚。为什么您的示例输出以 2 开头?以下是如何从第一次出现 1 开始计算所有内容。我修改了示例,让它从 1 开始:

library(tidyverse)
df <- data.frame("x" = c(1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", 1, "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1))

df <-
  df %>%
  na_if("NA") %>%
  as_tibble() %>%
  mutate(id = row_number())

y <-
  df %>%
  filter(x == 1) %>%
  # calculate block sizes
  transmute(
    from = id,
    to = lead(id),
    diff = to - from
  ) %>%
  # vector ends with a 1 and there is no n+1 th element
  replace_na(list(diff = 1)) %>%
  pull(diff) %>%
  map(seq) %>%
  flatten() %>%
  as.numeric()
y
#>  [1] 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5 6
#> [39] 1 2 3 4 5 6 7 8 9 1

df %>% transmute(x, y = y)
#> # A tibble: 48 x 2
#>    x         y
#>    <chr> <dbl>
#>  1 1         1
#>  2 <NA>      2
#>  3 <NA>      3
#>  4 <NA>      4
#>  5 <NA>      5
#>  6 <NA>      6
#>  7 <NA>      7
#>  8 <NA>      8
#>  9 1         1
#> 10 <NA>      2
#> # … with 38 more rows

reprex 包于 2021-10-20 创建(v2.0.1)


推荐阅读