获取前一小时时段非空值的R代码

ugmeyewa  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(195)

输入表如下所示。需要使用先前的非空行Value创建新列,考虑到当前行Hour_Slot之前的最新Hour_slot,按ID分组
| ID|小时槽|X|价值|
| --------------|--------------|--------------|--------------|
| ID1|2023-04-01 2:00:00|1|十六岁|
| ID1|2023-04-01 3:00:00|1|十三点五|
| ID1|2023-04-01 4:00:00|1|不适用|
| ID1|2023-04-01 5:00:00|1|四点五|
| ID1|2023-04-01 23:00:00|1|十二岁|
| ID1|2023-04-01 24:00:00|1|八点五|
| ID1|2023-04-01 4:00:00|二|十一点五|
| ID1|2023-04-01 5:00:00|二|十二岁|
输出:
| ID|小时槽|X|价值|输出值|
| --------------|--------------|--------------|--------------|--------------|
| ID1|2023-04-01 2:00:00|1|十六岁|不适用|
| ID1|2023-04-01 3:00:00|1|十三点五|十六岁|
| ID1|2023-04-01 4:00:00|1|不适用|十三点五|
| ID1|2023-04-01 5:00:00|1|四点五|十三点五|
| ID1|2023-04-01 23:00:00|1|十二岁|四点五|
| ID1|2023-04-01 24:00:00|1|八点五|十二岁|
| ID1|2023-04-01 4:00:00|二|十一点五|十三点五|
| ID1|2023-04-01 5:00:00|二|十二岁|十三点五|
示例R代码:

df[, output_Value:=shift(value, type="lag"), by= ID]
df <- df %>% group_by(ID) %>% fill(output_Value)

上面的代码没有考虑Hour_Slot。有可能有两行具有相同的Hour_slot。我需要前一小时时段的非空值为output_Value

c3frrgcw

c3frrgcw1#

一种方法是使用一系列dplyr::mutate()tifyr::fill()转换:

library(dplyr)
library(tidyr)

df %>%
  mutate(output_Value = case_when(row_number(Hour_slot) == 1 ~ Value),
         .by = c(Hour_slot, ID)) %>%
  mutate(output_Value = lag(output_Value)) %>%
  group_by(ID) %>%
  fill(output_Value, .direction = "down") %>% ungroup() %>%
  mutate(output_Value = head(output_Value, 1), .by = c(Hour_slot, ID))

输出:

ID           Hour_slot X Value output_Value
1 id1 2023-04-01 02:00:00 1  16.0           NA
2 id1 2023-04-01 03:00:00 1  13.5         16.0
3 id1 2023-04-01 04:00:00 1    NA         13.5
4 id1 2023-04-01 05:00:00 1   4.5         13.5
5 id1 2023-04-01 23:00:00 1  12.0          4.5
6 id1 2023-04-02 00:00:00 1   8.5         12.0
7 id1 2023-04-01 04:00:00 2  11.5         13.5
8 id1 2023-04-01 05:00:00 2  12.0         13.5

相关问题