Saya mencoba menjalankan suatu fungsi meskipun saya tidak yakin apakah ini jawaban yang benar. Saya baru di Rstudio dan saya mencoba menghitung Jumlah faktur yang dibayar sebelum tanggal pembuatan faktur baru setiap pelanggan dan kolom lain Jumlah faktur yang terlambat dibayar sebelum tanggal pembuatan faktur baru setiap pelanggan Data saya:

set.seed(123)

names<- rep(LETTERS[1:2], each = 16)
id<- seq(1,32)
daysp<- runif(1:32,1,32)
startdate <-c("20-02-2018","01-03-2018","13-03-2018","20-03-2018","28-03-2018","05-04-2018","10-04-2018","13-04-2018",
        "16-04-2018","19-04-2018","04-05-2018","14-05-2018","23-05-2018","04-06-2018","12-06-2018","19-06-2018",
        "26-04-2018","02-05-2018","07-05-2018","07-05-2018","07-05-2018","14-05-2018","29-05-2018","12-06-2018",
        "12-06-2018","18-06-2018","11-07-2018","11-07-2018","17-07-2018","30-07-2018","03-08-2018","07-08-2018")
startdate<-as.Date(startdate,"%d-%m-%Y" )
paydate<- startdate + daysp
class <- c("Payed", "Payed","Payed", "Delayed","Payed", "Delayed","Delayed", "Delayed","Payed", "Delayed",
       "Payed", "Delayed","Payed", "Delayed","Payed", "Delayed","Payed", "Delayed","Payed", "Delayed",
       "Payed", "Delayed","Payed", "Delayed","Payed", "Delayed","Delayed", "Delayed","Payed", "Delayed",
       "Payed", "Delayed")
df<-data.frame(names,id,daysp,startdate,paydate,class)

Hasil yang saya harapkan terlihat seperti ini:

nopip<-c(0,0,1,1,3,3,4,4,4,5,7,10,10,12,12,14,0,0,2,2,2,2,3,6,6,6,9,9,10,12,13,14)
nopip_delayed<-c(0,0,0,0,0,0,1,1,1,2,3,5,5,6,6,6,0,0,1,1,1,1,1,3,3,3,4,4,5,6,7,8)

Seperti kerangka data ini

df<-cbind(df,nopip,nopip_delayed)

Terima kasih sebelumnya

1
Fenico Alarcon 19 November 2020, 18:10

1 menjawab

Jawaban Terbaik

Ada beberapa cara untuk mencapai ini, tetapi di sini ada satu yang menggunakan basis R yang baik untuk dipahami untuk membangun fondasi untuk berkembang.

Ini menggunakan lapply untuk menelusuri data.frame dan memeriksa apakah nama-nama tersebut cocok dengan baris itu bersama dengan tanggal pembayaran sebelum tanggal mulai.

df$nopip2 <- lapply(seq_len(nrow(df)), function(x) sum(df$names == df$names[x] & df$paydate < df$startdate[x]))

Ini melakukan urutan yang sama seperti fungsi sebelumnya, tetapi menambahkan pemeriksaan tambahan jika kelas ditunda.

df$nopip_delayed2 <- lapply(seq_len(nrow(df)), function(x) sum(df$names == df$names[x] & df$paydate < df$startdate[x] & df$class == 'Delayed'))

Mengonfirmasi hasil yang dihitung sama dengan output yang diinginkan

> setequal(df$nopip, df$nopip2)
[1] TRUE
> setequal(df$nopip_delayed, df$nopip_delayed2)
[1] TRUE

Menambahkan contoh ke sum daysp dengan masing-masing nopip

df$nopip_daysp <- lapply(seq_len(nrow(df)), function(x) sum((df$names == df$names[x] & df$paydate < df$startdate[x]) * df$daysp))

Sebagai catatan tambahan, iterasi melalui data.frame adalah opsi yang mahal jika jumlah barisnya besar. Namun, menggunakan langkah-langkah di atas akan menjadi transisi yang mudah jika waktu itu muncul.

1
manotheshark 23 November 2020, 14:54