我有一個資料集,其中列出了一系列團隊(例如“A”、“B”)和每個團隊中用戶的 ID。
下面的示例資料集(前 2 列)。實際資料運行到 500k 以上,所以我一直試圖在 R 中實作一個回圈,但沒有成功。
示例資料集
我希望能夠根據下一行評估每一行,
即如果第 1 行 = A 隊 & 第 2 行 = A 隊,“通過”,
如果第 1 行 = 團隊 A & 第 2 行 = 團隊 B,則“失敗”
如果第 1 行 = B 隊 & 第 2 行 = B 隊,“通過”
如果第 1 行 = 團隊 B & 第 2 行 = 團隊 A,“失敗”,
每次迭代都會比較下一組行(例如,1 與 2 比較,然后 2 與 3 比較,依此類推)。
每個新列的輸出,詳細說明結果,即通過/失敗。
如果結果是“通過”,我想要 2 個新列,第一個在第一行有用戶 ID,第二個在與之比較的行中的用戶 - 就像一個邊緣串列 - 例如下面所需的輸出格式,比較第 1 行和第 2 行,每個都有團隊,并且“通過”,因此將用戶 1 插入到 user_id_out 中,將用戶 2 插入到 user_id_in 列中。
如果結果失敗,則 user_id_out(和 in)的內容將為 NA。
期望的輸出
任何有關如何做到這一點的幫助將不勝感激。:)
uj5u.com熱心網友回復:
歡迎來到stackoverflow。請記住始終包含可重現的資料示例,不要共享螢屏截圖。
您可以使用 dplyr 函式來完成。
library(dplyr)
# The data
data <- data.frame(
team = c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'A', 'B', 'B'),
user_id = c(1, 2, 3, 4, 5, 6, 7, 1, 5, 3, 4, 6, 7)
)
data %>%
mutate(
outcome = case_when(
team == lead(team) ~ 'pass',
TRUE ~ 'fail'
),
user_id_out = ifelse(outcome == 'pass', user_id, NA),
user_id_in = ifelse(outcome == 'pass', lead(user_id), NA)
)
#> team user_id outcome user_id_out user_id_in
#> 1 A 1 pass 1 2
#> 2 A 2 pass 2 3
#> 3 A 3 pass 3 4
#> 4 A 4 fail NA NA
#> 5 B 5 pass 5 6
#> 6 B 6 pass 6 7
#> 7 B 7 fail NA NA
#> 8 A 1 fail NA NA
#> 9 B 5 fail NA NA
#> 10 A 3 pass 3 4
#> 11 A 4 fail NA NA
#> 12 B 6 pass 6 7
#> 13 B 7 fail NA NA
由reprex 包于 2022-03-29 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/452813.html
