我有一個包含許多變數的資料框,但我只想關注一個“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開始按順序填充數字:
- 當有 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)
但這并沒有給我回傳預期的輸出,為什么?
uj5u.com熱心網友回復:
由于x從 8 連續開始,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 包(v2.0.1)于 2021 年 10 月 20 日創建
uj5u.com熱心網友回復:
與@danlooo 相同的方法,但使用 data.table 而不是 tidyverse
df <- data.table(x = as.integer(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[, id := .I][!is.na(x), diff := lead(id) - id][is.na(diff), diff := 1L][, y := unlist(mapply(seq, df[x == 1L]$diff))][, c("id", "diff") := NULL]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/326976.html
上一篇:在R中為孿生資料重塑資料框
