2017-08-29 1 views
1

Ich habe ein Datenframe namens data. Ich versuche, eine neue Spalte mit 0 und 1s für jede CRD_NUM und BIZ_DT zu erstellen. Ich werde nach dem Maximum Jrny_Ind suchen und 1 der neuen Spalte zuweisen, wo der maximale Wert in dieser Zeile gefunden wird.Erstellen Sie Binär Spalte basierend auf Bedingung mit data.table

Hier die Daten mit arbeiten:

structure(list(JRNY_ID_NUM = c(115485143065, 115581455926, 115542253339, 
    115568253504, 115579064996, 115557373723), CRD_NUM = c(1000148004095169, 
    1000148004095169, 1000148004095169, 1000148004095169, 1000148004095169, 
    1000148004095169), BIZ_DT = structure(c(3L, 3L, 4L, 4L, 5L, 5L 
    ), .Label = c("01-Jan-17", "02-Jan-17", "03-Jan-17", "04-Jan-17", 
    "05-Jan-17", "06-Jan-17", "07-Jan-17", "08-Jan-17", "09-Jan-17", 
    "10-Jan-17", "11-Jan-17", "12-Jan-17", "13-Jan-17", "14-Jan-17", 
    "15-Jan-17", "16-Jan-17", "17-Jan-17", "18-Jan-17", "19-Jan-17", 
    "20-Jan-17", "21-Jan-17", "22-Jan-17", "23-Jan-17", "24-Jan-17", 
    "25-Jan-17", "26-Jan-17", "27-Jan-17", "28-Jan-17", "29-Jan-17", 
    "30-Jan-17", "31-Jan-17"), class = "factor"), Jrny_Ind = c(1L, 
    2L, 1L, 2L, 1L, 2L)), .Names = c("JRNY_ID_NUM", "CRD_NUM", "BIZ_DT", 
    "Jrny_Ind"), class = c("data.table", "data.frame"), row.names = c(NA, 
    -6L), .internal.selfref = <pointer: 0x0000000002640788>) 

gewünschte Ausgabe:

JRNY_ID_NUM   CRD_NUM BIZ_DT Jrny_Ind Last_Trip 
1: 115485143065 1000148004095169 03-Jan-17  1 0 
2: 115581455926 1000148004095169 03-Jan-17  2 1 
3: 115542253339 1000148004095169 04-Jan-17  1 0 
4: 115568253504 1000148004095169 04-Jan-17  2 1 
5: 115579064996 1000148004095169 05-Jan-17  1 0 
6: 115557373723 1000148004095169 05-Jan-17  2 1 

Ich habe versucht, die "max Reihen" für jede Karte und das Datum wie unten zu bekommen:

data[, .SD[which.max(Jrny_Ind)], by = c("CRD_NUM","BIZ_DT")] 

Nicht sicher, wie eine neue Spalte mit data.table zugewiesen wird.

+1

'data [, last_trip: = + (Jrny_Ind == max (Jrny_Ind)), by = (CRD_NUM, BIZ_DT).]' (Oder 'as.integer' anstelle des' + ') – Jaap

+2

' Bibliothek (dplyr); dat%>% group_by (CRD_NUM, BIZ_DT)%>% mutieren (Last_Trip = as.integer (Jrny_Ind == max (Jrny_Ind))) ' – Masoud

Antwort

2

Es sollte ein Duplikat dafür sein. Aber jetzt:

data[, last_trip := as.integer(Jrny_Ind == max(Jrny_Ind)), by = .(CRD_NUM, BIZ_DT)] 
2

Mit dplyr:

library(dplyr) 
dat %>% group_by(CRD_NUM, BIZ_DT) %>% 
     mutate(Last_Trip = as.integer(Jrny_Ind == max(Jrny_Ind))) 

Oder plyr:

library(plyr) 
ddply(dat,.(CRD_NUM, BIZ_DT),transform,Last_Trip = as.numeric(Jrny_Ind == max(Jrny_Ind))) 

Output:

dat 
## # A tibble: 6 x 6 
## # Groups: CRD_NUM, BIZ_DT [3] 
## JRNY_ID_NUM  CRD_NUM BIZ_DT Jrny_Ind last_trip Last_Trip 
##   <dbl>  <dbl> <fctr> <int>  <int>  <int> 
## 1 115485143065 1.000148e+15 03-Jan-17  1   0   0 
## 2 115581455926 1.000148e+15 03-Jan-17  2   1   1 
## 3 115542253339 1.000148e+15 04-Jan-17  1   0   0 
## 4 115568253504 1.000148e+15 04-Jan-17  2   1   1 
## 5 115579064996 1.000148e+15 05-Jan-17  1   0   0 
## 6 115557373723 1.000148e+15 05-Jan-17  2   1   1 
Verwandte Themen