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

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Jörg
Beiträge: 25
Registriert: Mi Nov 09, 2016 2:58 pm

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

Beitrag 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)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

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

Beitrag 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]
Jörg
Beiträge: 25
Registriert: Mi Nov 09, 2016 2:58 pm

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

Beitrag 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]

Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

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

Beitrag von Athomas »

Code: Alles auswählen

DT[  , NB := 1:.N, by = ID]
ist datatable-Slang und einfacher :) ...
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

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

Beitrag 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]  
Jörg
Beiträge: 25
Registriert: Mi Nov 09, 2016 2:58 pm

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

Beitrag 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
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

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

Beitrag 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: !
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Antworten