Selamat malam! Saya memiliki data.frame berikut dari mana saya ingin mengekstrak baris yang kualifikasinya berubah dari satu bulan ke bulan berikutnya. Saya tidak tahu bagaimana mendekati ini, sayangnya ...

Data:

id <- c("A","B","C","D","A","B","C","D","A","B","C","D")
qualifier <- c("G","H","I","I","I","H","Y","I","I","I","I","I")
date <- c("01/31/15","01/31/15",'01/31/15','01/31/15','02/28/15', "02/28/15", "02/28/15","02/28/15","03/31/15","03/31/15","03/31/15","03/31/15")
sample.data <- data.frame(id,qualifier,date)

"Id" unik untuk tanggal tertentu tetapi mungkin ada atau tidak ada pada tanggal lain. Setiap "id" memiliki kualifikasi "I" atau "H". Semua tanggal adalah akhir bulan. Saya ingin mengekstrak semua baris yang kualifikasi idnya berubah dari "I" atau "G" menjadi "H" atau "Y" dari satu bulan ke bulan berikutnya. Jadi, untuk menentukan, hanya perubahan dari 31/01/15 ke 28/02/15 yang relevan, bukan perubahan dari 31/01/15 menjadi 31/03/15. Mengingat data.frame di atas, perubahan yang saya minati adalah baris 7, ketika kualifikasi untuk "id" C berubah dari "I" (dari baris 3) menjadi "Y" . Idealnya, baris 7 yang diekstraksi akan memiliki nilai kualifikasi dari baris 3 juga.

Hasilnya akan terlihat seperti ini:

id   qualifier  date       qualifier.previous.month
C    H          02/28/15   I

Terima kasih sebelumnya atas bantuan apa pun!

0
cthulhukk 11 Januari 2021, 00:25

3 jawaban

Jawaban Terbaik
# Change the date to a Date format
sample.data$date <- as.Date(sample.data$date, format = "%m/%d/%y")

# Collect the month value from the date
sample.data$month <- as.numeric(format(sample.data$date, "%m")) 

# Create a copy of the sample dataframe
sample.data_shifted <- sample.data

# Shift the months by one in the copied dataframe
sample.data_shifted$month <- sample.data_shifted$month + 1

# Merge the dataframes, so each ID/month row has the current and previous month qualifier 
sample.data_merged <- merge(
  sample.data_shifted, sample.data, 
  by = c("id", "month"), 
  suffixes = c(".previous.month", ".current.month")
  )

# Tidying up dates
sample.data_merged$date <- sample.data_merged$date.current.month

sample.data_merged <- subset(sample.data_merged, select = -c(date.previous.month, date.current.month))

# We create a logical vector telling us which qualifiers changed between which months
previous_month_ig <- sample.data_merged$qualifier.previous.month %in% c("I", "G")
current_month_hy <- sample.data_merged$qualifier.current.month %in% c("H", "Y")

# Now we only look at IDs/months where the qualifier changed from I/G to H/Y
sample.data_final <- sample.data_merged[previous_month_ig & current_month_hy, ]

sample.data_final

  id month qualifier.previous.month qualifier.current.month       date
5  C     2                        I                       Y 2015-02-28

Ini harus sesuai dengan spesifikasi Anda - agak panjang untuk membuatnya lebih jelas. Idenya di sini adalah untuk menggabungkan kembali ke kerangka data Anda dengan bulan-bulan digeser satu. Ini akan berfungsi jika Anda hanya memiliki satu tanggal per bulan.

2
ashetty 10 Januari 2021, 22:34

Mungkin opsi R dasar menggunakan ave dalam transform dapat membantu

transform(
  sample.data,
  qualifier.previous.month = ave(qualifier, id, FUN = function(x) c(NA, x[-length(x)]))
)

Yang memberikan

   id qualifier     date qualifier.previous.month
1   A         G 01/31/15                     <NA>
2   B         H 01/31/15                     <NA>
3   C         I 01/31/15                     <NA>
4   D         I 01/31/15                     <NA>
5   A         I 02/28/15                        G
6   B         H 02/28/15                        H
7   C         Y 02/28/15                        I
8   D         I 02/28/15                        I
9   A         I 03/31/15                        I
10  B         I 03/31/15                        H
11  C         I 03/31/15                        Y
12  D         I 03/31/15                        I

Opsi data.table menggunakan shift dapat membuatnya juga

> setDT(sample.data)[, qualifier.previous.month := shift(qualifier), id][]
    id qualifier     date qualifier.previous.month
 1:  A         G 01/31/15                     <NA>
 2:  B         H 01/31/15                     <NA>
 3:  C         I 01/31/15                     <NA>
 4:  D         I 01/31/15                     <NA>
 5:  A         I 02/28/15                        G
 6:  B         H 02/28/15                        H
 7:  C         Y 02/28/15                        I
 8:  D         I 02/28/15                        I
 9:  A         I 03/31/15                        I
10:  B         I 03/31/15                        H
11:  C         I 03/31/15                        Y
12:  D         I 03/31/15                        I
2
ThomasIsCoding 10 Januari 2021, 22:18
library(data.table)

id <- c("A","B","C","D","A","B","C","D","A","B","C","D")
qualifier <- c("G","H","I","I","I","H","Y","I","I","I","I","I")
date <- c("01/31/15","01/31/15",'01/31/15','01/31/15','02/28/15', "02/28/15", "02/28/15","02/28/15","03/31/15","03/31/15","03/31/15","03/31/15")
sample.data <- data.frame(id,qualifier,date)

setDT(sample.data)

sample.data[, qualifier.previous.month := shift(.SD, 1, 0, "lag"), by = id]
> sample.data
    id qualifier     date qualifier.previous.month
 1:  A         G 01/31/15                        0
 2:  B         H 01/31/15                        0
 3:  C         I 01/31/15                        0
 4:  D         I 01/31/15                        0
 5:  A         I 02/28/15                        G
 6:  B         H 02/28/15                        H
 7:  C         Y 02/28/15                        I
 8:  D         I 02/28/15                        I
 9:  A         I 03/31/15                        I
10:  B         I 03/31/15                        H
11:  C         I 03/31/15                        Y
12:  D         I 03/31/15                        I
0
tester 10 Januari 2021, 22:09