我正試圖以有條件的方式糾正一個資料集中的一些錯誤條目。我需要通過分組來實作這一目標,并且條件是基于兩個不同資料集的兩個時間戳之間的差異。
下面是我正在處理的一些資料型別的例子:-
df1< -結構(list(UserID = c("AAA"/span>, "AAA", "AAA"。 "BBB", "BBB",
"BBB", "BBB"/span>, "CCC"/span>。 "CCC", "CCC"。 "CCC", "CCC"。 "DDD", "DDD", "DDD" ,
"DDD", "DDD"。 "DDD", "DDD")。 值 = c("Group1"。 "Group1", "Group2",
"Group3", "Group3"。 "Group1",/span> "Group2"。 "Group4", "Group5"。 "Group5",
"Group5", "Group5"。 "Group1",/span> "Group2"。 "Group2",/span> "Group2"。 "Group2",
"Group2")。 時間=結構(c(1577840400。 1577844000, 1577847600,
1577966400, 1577970000, 1577973600。 1577977200, 1577977200。 1577980800,
1577984400, 1577988000, 1577991600。 1578193200,/span> 1578196800。 1578200400, 1578200400,
1578204000,/span> 1578207600。 1578211200)。 class = c("POSIXct"/span>。 "POSIXt"/span>
)。 tzone = "UTC")),/span>行。 names = c(NA。 -18L)。 class = "data. frame")
df2< -結構(list(UserID = c("AAA"/span>, "AAA", "AAA"。 "BBB", "BBB",
"BBB", "BBB"/span>, "CCC"/span>。 "CCC", "DDD"。 "DDD")。 StartTime =結構(c(1577839980。
1577840460, 1577843820。 1577966580。 1577970180, 1577973360, 1577975160, 1577975160,
1577977920,/span> 1577978940。 1578193200。 1578193920)。 class = c("POSIXct"/span>。
"POSIXt")。 tzone = "UTC")。 EndTime =結構(c(1577840460。
1577843820, 1577846640。 1577970180。 1577973360, 1577975160, 1577978580, 1577978580,
1577978940,/span> 1577980680。 1578193920。 1578196620)。 class = c("POSIXct"/span>。
"POSIXt")。 tzone = "UTC")),/span> row. names = c(NA。 -11L)。 class = "data. frame")
這兩個資料集看起來像這樣:-
print(df1)
用戶ID值時間
1 AAA組1 2020-01-01 01。 00: 00
2 AAA組1 2020-01-01 02。 00: 00
3 AAA組2 2020-01-01 03。 00: 00
4 BBB組3 2020-01-02 12。 00: 00
5 BBB組3 2020-01-02 13。 00: 00
6 BBB組1 2020-01-02 14。 00: 00
7 BBB組2 2020-01-02 15。 00: 00
8 CCC組4 2020-01-02 15。 00: 00
9 CCC組5 2020-01-02 16。 00: 00
10 CCC組5 2020-01-02 17。 00: 00
11 CCC組5 2020-01-02 18。 00: 00
12 CCC組5 2020-01-02 19。 00: 00
13 DDD Group1 2020-01-05 03。 00: 00
14 DDD Group2 2020-01-05 04。 00: 00
15 DDD Group2 2020-01-05 05。 00: 00
16 DDD Group2 2020-01-05 06。 00: 00
17 DDD Group2 2020-01-05 07。 00: 00
18 DDD Group2 2020-01-05 08。 00: 00
print(df2)
用戶ID 開始時間 結束時間
1 AAA 2020-01-01 00。 53: 00 2020-01-01 01。 01: 00
2 AAA 2020-01-01 01。 01: 00 2020-01-01 01。 57: 00
3 AAA 2020-01-01 01。 57: 00 2020-01-01 02。 44: 00
4 BBB 2020-01-02 12。 03: 00 2020-01-02 13。 03: 00
5 BBB 2020-01-02 13。 03: 00 2020-01-02 13。 56: 00
6 BBB 2020-01-02 13。 56: 00 2020-01-02 14。 26: 00
7 BBB 2020-01-02 14。 26: 00 2020-01-02 15。 23: 00
8 CCC 2020-01-02 15。 12: 00 2020-01-02 15。 29: 00
9 CCC 2020-01-02 15。 29: 00 2020-01-02 15。 58: 00
10 DDD 2020-01-05 03。 00: 00 2020-01-05 03。 12: 00
11 DDD 2020-01-05 03。 12: 00 2020-01-05 03。 57: 00
df1中的時間戳列是四舍五入到每小時,而df2中有一個起始時間戳和一個結束時間戳(兩者都是細化的,四舍五入到分鐘)。df1中的一些條目是不正確的,因為它們在相應的時間沒有出現在df2中。
例如,UserID CCC在df2中最后的EndTime時間戳是2020-01-02 15:58:00,但在df1中,CCC出現在2020-01-02 17:00:00,2020-01-02 18:00:00 & 2020-01-02 19:00:00; 類似的例子還有UserID DDD.
我想做什么
如果一個 UserID 在 df1 中有一個條目,其 df1$Time 的時間戳比他們在 df2 中的最后一個 df2$EndTime 的時間戳大 60 分鐘,我希望 df1$Value 中的條目被改為 "NoGroup"。
下面是一個所需結果的說明性例子:-
UserID Value Time
1 AAA組1 2020-01-01 01。 00: 00
2 AAA組1 2020-01-01 02。 00: 00
3 AAA組2 2020-01-01 03。 00: 00
4 BBB組3 2020-01-02 12。 00: 00
5 BBB組3 2020-01-02 13。 00: 00
6 BBB組1 2020-01-02 14。 00: 00
7 BBB組2 2020-01-02 15。 00: 00
8 CCC組4 2020-01-02 15。 00: 00
9 CCC組5 2020-01-02 16。 00: 00
10 CCC NoGroup 2020-01-02 17。 00: 00
11 CCC NoGroup 2020-01-02 18。 00: 00
12 CCC NoGroup 2020-01-02 19。 00: 00
13 DDD Group1 2020-01-05 03。 00: 00
14 DDD Group2 2020-01-05 04。 00: 00
15 DDD NoGroup 2020-01-05 05。 00: 00
16 DDD NoGroup 2020-01-05 06。 00: 00
17 DDD NoGroup 2020-01-05 07。 00: 00
18 DDD NoGroup 2020-01-05 08。 00: 00
如果有任何指導意見,我們將一如既往地表示感謝:)
uj5u.com熱心網友回復:
使用dplyr:
df1 %>%
left_join(df2 %>% group_by(UserID) %> %過濾器(EndTime == max(EndTime))。 by = "UserID") %> %
mutate(Value = if_else(Time-EndTime > = 60, "NoGroup"/span>。 Value)) %> %
選擇(-c(4。 5))
首先你連接每個UserID的最后EndTimes到df2,接下來你檢查是否有任何Time超過這個EndTime的60分鐘,并相應改變Value。最后,您將洗掉在join程序中添加的列
uj5u.com熱心網友回復:
df1< -結構(list(UserID = c("AAA"/span>。 "AAA", "AAA"。 "BBB", "BBB",
"BBB", "BBB"/span>, "CCC"/span>。 "CCC", "CCC"。 "CCC", "CCC"。 "DDD", "DDD", "DDD" ,
"DDD", "DDD"。 "DDD", "DDD")。 值 = c("Group1"。 "Group1", "Group2",
"Group3", "Group3"。 "Group1",/span> "Group2"。 "Group4", "Group5"。 "Group5",
"Group5", "Group5"。 "Group1",/span> "Group2"。 "Group2",/span> "Group2"。 "Group2",
"Group2")。 時間=結構(c(1577840400。 1577844000, 1577847600,
1577966400, 1577970000, 1577973600。 1577977200, 1577977200。 1577980800,
1577984400, 1577988000, 1577991600。 1578193200,/span> 1578196800。 1578200400, 1578200400,
1578204000,/span> 1578207600。 1578211200)。 class = c("POSIXct"/span>。 "POSIXt"/span>
)。 tzone = "UTC")),/span>行。 names = c(NA。 -18L)。 class = "data. frame")
df2< -結構(list(UserID = c("AAA"/span>, "AAA", "AAA"。 "BBB", "BBB",
"BBB", "BBB"/span>, "CCC"/span>。 "CCC", "DDD"。 "DDD")。 StartTime =結構(c(1577839980。
1577840460, 1577843820。 1577966580。 1577970180, 1577973360, 1577975160, 1577975160,
1577977920,/span> 1577978940。 1578193200。 1578193920)。 class = c("POSIXct"/span>。
"POSIXt")。 tzone = "UTC")。 EndTime =結構(c(1577840460。
1577843820, 1577846640。 1577970180。 1577973360, 1577975160, 1577978580, 1577978580,
1577978940,/span> 1577980680。 1578193920。 1578196620)。 class = c("POSIXct"/span>。
"POSIXt")。 tzone = "UTC")),/span> row. names = c(NA。 -11L)。 class = "data. frame")
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> 以下物件被屏蔽在'package:base'之外:
#>
#> date, intersect, setdiff, union
no_groups <-
df1 %>%。
as_tibble() %>
left_join(df2 %> % as_tibble() %>%
group_by(UserID) %>%
mutate()
last_end = max(EndTime)
) %>%
mutate()
no_group = all((last_end - 時間) < =分鐘(60))
) %>%
distinct(UserID,no_group)
#> Joining, by = "UserID"
無群組
#> # A tibble: 4 x 2
#> # 群組。 用戶ID[4]
#> UserID no_group
#> <chr> <lgl>
#> 1 AAA FALSE
#> 2 BBB FALSE
#> 3 CCC TRUE
#> 4 DDD TRUE[/span]。
df1%>%
as_tibble() %>%
left_join(no_groups) %>%
mutate(Value = ifelse(no_group。 "NoGroup", Value) %>。 %
select(-no_group)
#> Joining, by = "UserID"
#> # A tibble: 18 x 3
#> UserID值時間
#> <chr> <chr> <dttm>
#> 1 AAA Group1 2020-01-01 01:00:00
#> 2 AAA組1 2020-01-01 02:00:00
#> 3 AAA組2 2020-01-01 03:00:00[/span
#> 4 BBB組3 2020-01-02 12:00:00[/span]。
#> 5 BBB Group3 2020-01-02 13:00:00[/span]。
#> 6 BBB Group1 2020-01-02 14:00:00[/span]。
#> 7 BBB Group2 2020-01-02 15:00:00[/span]。
#> 8 CCC NoGroup 2020-01-02 15:00:00[/span
#> 9 CCC NoGroup 2020-01-02 16:00:00[/span]。
#> 10 CCC NoGroup 2020-01-02 17:00:00[/span]。
#> 11 CCC NoGroup 2020-01-02 18:00:00[/span
#> 12 CCC NoGroup 2020-01-02 19:00:00[/span
#> 13 DDD NoGroup 2020-01-05 03:00:00[/span]。
#> 14 DDD NoGroup 2020-01-05 04:00:00[/span]。
#> 15 DDD NoGroup 2020-01-05 05:00:00[/span]。
#> 16 DDD NoGroup 2020-01-05 06:00:00[/span]。
#> 17 DDD NoGroup 2020-01-05 07:00:00[/span]。
#> 18 DDD NoGroup 2020-01-05 08:00:00[/span]。
創建于2021-09-17,由reprex包(v2.0.0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329422.html
標籤:
上一篇:C#:IFELSE替換
