GOOGLE ADS

Freitag, 22. April 2022

Ersetzen Sie NA zwischen zwei Werten ohne Schleife

Ich habe folgenden Datenrahmen:

data <- structure(list(Date = structure(c(-17897, -17896, -17895, -17894, 
-17893, -17892, -17891, -17890, -17889, -17888, -17887, -17887,
-17886, -17885, -17884, -17883, -17882, -17881, -17880, -17879,
-17878, -17877, -17876, -17875, -17874, -17873, -17872, -17871,
-17870, -17869, -17868, -17867, -17866, -17865, -17864), class = "Date"),
duration = c(NA, NA, NA, 5, NA, NA, NA, 5, NA, NA, 1, 1,
NA, NA, 3, NA, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 4, NA, NA, 4, NA, NA), name = c(NA, NA, NA, "Date_beg",
NA, NA, NA, "Date_end", NA, NA, "Date_beg", "Date_end", NA,
NA, "Date_beg", NA, "Date_end", NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, "Date_beg", NA, NA, "Date_end", NA, NA
)), row.names = c(NA, -35L), class = c("tbl_df", "tbl", "data.frame"
))

Und sieht aus wie:

 Date duration name 
<date> <dbl> <chr>
1 1921-01-01 NA NA
2 1921-01-02 NA NA
3 1921-01-03 NA NA
4 1921-01-04 5 Date_beg
5 1921-01-05 NA NA
6 1921-01-06 NA NA
7 1921-01-07 NA NA
8 1921-01-08 5 Date_end
9 1921-01-09 NA NA
10 1921-01-10 NA NA
...

Ich möchte die NAWerte in der Spalte namezwischen den Zeilen durch Date_begund Date_enddurch das Wort "event" ersetzen.

Ich habe dies versucht:

data %<>% mutate(name = ifelse(((lag(name) == 'Date_beg')|(lag(name) == 'event')) &

Aber nur die erste Zeile nach Date_beg ändert sich. Mit einer for-Schleife ist es ganz einfach, aber ich wollte eine R-ähnlichere Methode verwenden.


Lösung des Problems

Es gibt wahrscheinlich einen besseren Weg mit data.table::nafill, aber da Sie tidyverseFunktionen verwenden, würde ich es tun, indem Sie eine zusätzliche eventSpalte mit erstellen tidyr::fillund sie dann zu der nameSpalte ziehen, in der nameNA ist:

library(tidyr)
data %>%
mutate(
events = ifelse(
fill(data, name)$name == "Date_beg",
"event",
NA),
name = coalesce(name, events)
) %>%
select(-events)

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...