理想情況下為以下問題尋找一個 tidyverse 解決方案。
我有以隨機順序出現的資料。每行都有一個唯一的四位數識別符號(下面標有 ID)。我最初按日期列對它進行分組(很簡單)。另一列指示該日期內的上一行應該是什么(下面標記為 Prev_ID)。給定日期的第一行有一個 Prev_ID,它不會參考該日期內的某些內容。我想要一個輸出如下:
Date ID Prev_ID
1/1 8731 1436
1/1 4522 8731
1/1 1301 4522
1/2 6675 3690
1/2 9123 6675
1/2 0025 9123
我已經嘗試創建一些回圈來做到這一點,但我有點迷失在雜草中,而且因為我正在處理大量資料,我擔心它會很慢。似乎這里應該有一個簡單的解決方案。
想法?
uj5u.com熱心網友回復:
隨機化行順序:
set.seed(42)
dat <- dat[sample(nrow(dat)),]
dat
# Date ID Prev_ID
# 1 1/1 8731 1436
# 5 1/2 9123 6675
# 6 1/2 0025 9123
# 4 1/2 6675 3690
# 2 1/1 4522 8731
# 3 1/1 1301 4522
基于Prev_IDin排序ID:
library(dplyr)
dat %>%
group_by(Date) %>%
mutate(otherrow = match(Prev_ID, ID)) %>%
arrange(Date, !is.na(otherrow), otherrow) %>%
ungroup() %>%
select(-otherrow)
# # A tibble: 6 x 3
# Date ID Prev_ID
# <chr> <chr> <chr>
# 1 1/1 8731 1436
# 2 1/1 4522 8731
# 3 1/1 1301 4522
# 4 1/2 6675 3690
# 5 1/2 0025 9123
# 6 1/2 9123 6675
注意:Date從長遠來看,一旦您的月-日超過 9,您作為字串將不適合排序順序,請注意,由于字典排序優先級,因此sort(c("1/2", "1/11"))將放在1/11 前面。 1/2您可以轉換為“真實” Date-object(您需要 year 組件),也可以將月-日轉換為用dat$Date <- sub("/([0-9])$", "/0\\1", dat$Date).
資料
dat <- structure(list(Date = c("1/1", "1/2", "1/2", "1/2", "1/1", "1/1"), ID = c("8731", "9123", "0025", "6675", "4522", "1301"), Prev_ID = c("1436", "6675", "9123", "3690", "8731", "4522")), row.names = c(1L, 5L, 6L, 4L, 2L, 3L), class = "data.frame")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525517.html
標籤:rtidyverse
