Seite 1 von 1

Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Fr Sep 20, 2019 5:18 pm
von Jörg
Hallo,

folgendes Problem:
In meinem Datensatz hat jede Beobachtung einer Person (p1,,,px) eine Zeile und die Anzahl der Beobachtungen pro Person variiert. Für jede Beobachtung ist das Datum bekannt. Ich möchte nun eine neue Variable generieren, in der jeder Beobachtung eine Zahl zugeordnet wird: die in chronologischer Reihenfolge 1. Beobachtung der Person P1 bekommt eine "1", die zweite Beobachtung derselben Person eine "2" usw.. Die Nummerierung beginnt für jede Person neu.

Im Code unten findet sich die gewünschte Spalte (BNr) schön "händisch" ergänzt. Wie kann ich das berechnen?

Ich danke für Eure Hilfe

Jörg

Code: Alles auswählen

library(lubridate)
Datum<-ymd(c("20160204","20150204","20190103","20180928","20160204","20190530","20180131","20160204","20160204","20180912"))
ID<-c("p1","p1","p2","p2","p3","p4","p4","p5","p6","p1")

NB<-c(2,1,2,1,1,2,1,1,1,3)
df_gewuenscht<-cbind(Datum,ID,NB);df<-dplyr::tbl_df(df_gewuenscht)

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Fr Sep 20, 2019 5:43 pm
von Athomas
Du wirst wahrscheinlich -zig Lösungen bekommen.
Ich mache das meistens so:

Code: Alles auswählen

library(data.table)
DT <- data.table(Datum = as.Date("20160204","20150204","20190103","20180928","20160204",
                                 "20190530","20180131","20160204","20160204","20180912", format="%Y%m%d"),
                 ID    = c("p1","p1","p2","p2","p3","p4","p4","p5","p6","p1"))
setorder(DT, ID, Datum)
DT[  , .(NB = 1:.N), by = ID]

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 2:31 pm
von Jörg
Danke, das funktioniert.

Den Code habe ich soweit angepasst, dass die neue Variable NB direkt in die Tabelle eingetragen wird.

Wie könnte ich jetzt ein Subset auswählen, in dem jede Person nur eine Beobachtung beiträgt und zwar immer die zeitlich gesehen aktuellste.

Vielen Dank!

Jörg

Code: Alles auswählen

library(data.table)
DT <- data.table(Datum = as.Date(c("20160204","20150204","20190103","20180928","20160204",
                                 "20190530","20180131","20160204","20160204","20180912"), format="%Y%m%d"),
                 ID    = c("p1","p1","p2","p2","p3","p4","p4","p5","p6","p1"))
setorder(DT, ID, Datum)
DT$NB<-DT[  , .(NB = 1:.N), by = ID][,2]


Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 2:52 pm
von Athomas

Code: Alles auswählen

DT[  , NB := 1:.N, by = ID]
ist datatable-Slang und einfacher :) ...

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 3:00 pm
von Athomas
Wie könnte ich jetzt ein Subset auswählen, in dem jede Person nur eine Beobachtung beiträgt und zwar immer die zeitlich gesehen aktuellste.
Dafür brauchst Du den "Durchnummerieren"-Schritt nicht (explizit):

Code: Alles auswählen

library(data.table)
DT <- data.table(data.frame(Datum = as.Date(c("20160204","20150204","20190103","20180928","20160204",
                                              "20190530","20180131","20160204","20160204","20180912"), format="%Y%m%d"),
                            ID    = c("p1","p1","p2","p2","p3","p4","p4","p5","p6","p1")))
setorder(DT, ID, Datum)

DT[, .SD[.N], by = ID]  

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 4:11 pm
von Jörg
Super, danke!

Die neue Variable "NB" erlaubt mir zu berechnen, wieviel Prozent der Personen 1,2,3 etc Beobachtungen hatten.

In den Code und die Logik von data.table muß ich mich echt noch reinarbeiten:

z.B. der Code

Code: Alles auswählen

DT[  , NB := 1:.N, by = ID]
erzeugt zwar eine Tabelle mit nun 3 Variablen (Datum, ID, NB), aber im Environment wird sie mit nur 2 Variablen angezeigt. Wenn man sie aber anwählt (view(DT), sieht man trotzdem alle drei?! siehe screen.
screen.PNG

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 9:14 pm
von Athomas
z.B. der Code DT[ , NB := 1:.N, by = ID] erzeugt zwar eine Tabelle mit nun 3 Variablen (Datum, ID, NB), aber im Environment wird sie mit nur 2 Variablen angezeigt.
Dann solltest Du das Environment mal erfrischen :lol: !

Re: Beobachtungen pro Person zählen und Rangzahl in chronologischer Reihenfolge zuweisen

Verfasst: Sa Sep 21, 2019 11:38 pm
von jogo
bei data.table fällt mir rleidv() ein.
Athomas hat geschrieben: Sa Sep 21, 2019 2:52 pm

Code: Alles auswählen

DT[  , NB := 1:.N, by = ID]
ist datatable-Slang und einfacher :) ...
Gruß, Jörg