переместить временной ряд (сбросить все значения ниже определенного порога) - PullRequest
0 голосов
/ 21 марта 2020

У меня есть следующий data.frame:

A <- c(10,20,30,90,180,400)
B <- c(5, 25, 50, 401, 490, 500)
C <- c(200, 300, 480, 890, 1100, 1200)
df <- data.frame(A, B, C)
df

Это выглядит так:

    A   B    C
1  10   5  200
2  20  25  300
3  30  50  480
4  90 401  890
5 180 490 1100
6 400 500 1200

Теперь я бы хотел переместить временные ряды A, B и C, так что первое значение выше определенного порога (например, 400). Таким образом, результат должен выглядеть следующим образом:

     A    B    C
1  400  401  480
2   NA  490  890
3   NA  500 1100
4   NA   NA 1200

1 Ответ

1 голос
/ 21 марта 2020

Мы можем использовать sapply до l oop над столбцом и фильтровать значения, которые превышают пороговое значение. Затем мы можем использовать cbind.fill из rowr, чтобы объединить их

setNames(do.call(rowr::cbind.fill, c(sapply(df, function(x) 
                 x[x >= 400]), fill = NA)), names(df))

#    A   B    C
#1 400 401  480
#2  NA 490  890
#3  NA 500 1100
#4  NA  NA 1200

A tidyverse опция:

library(tidyverse)

map(df, ~.x[.x >= 400]) %>%
    enframe() %>%
    unnest(value) %>%
    group_by(name) %>%
    mutate(row = row_number()) %>%
    pivot_wider() %>%
    select(-row)
...