Seite 1 von 1

subsetting

Verfasst: Mi Nov 29, 2017 6:20 pm
von serendipity
Ich versuche gerade einen Teil eines User geschriebenen Programms zu verstehen und zwar folgende Zeile:

Code: Alles auswählen

newvar = data[ ,length(unique(regionid)), personid][V1>0,personid]

Was die Zeile tun sollte ist ein subset der kompletten Datensatzes df zu bilden indem nur Personen enthalten sind die im Panel zumindest einmal die Region wechseln. Ich verstehe überhaupt nicht wie die Bedingung wirkt und wie das mit der zweiten Klammer zu lesen ist.

Die Fehlermeldung ist:
"Error in `[.data.frame`(data, length(unique(regionid)), personid) :
undefined columns selected "
Versuche ich die command Zeile einzeln abzurufen kommt nach:

Code: Alles auswählen

newvar = data[ df ,length(unique(regionid)), personid][V1>0,personid]
"Error: object 'V1' not found"
Viele Dank für die Hilfe!

Re: subsetting

Verfasst: Mi Nov 29, 2017 10:34 pm
von EDi
Das ist vermutlich data.table Syntax, d.h. data muss ein data.table sein.

Was es tut:
1) für jede Person, berechne die Anzahl der unterschiedlichen Regionen

2) von den Personen, wähle diejenigen die mindestens eine region haben.

Das V1 erachte ich als unschön, man hätte einen sinnvollen Namen vergeben können (V, ist Standart).

Re: subsetting

Verfasst: Do Nov 30, 2017 12:53 pm
von serendipity
EDi hat geschrieben: Mi Nov 29, 2017 10:34 pm Das ist vermutlich data.table Syntax, d.h. data muss ein data.table sein.

Was es tut:
1) für jede Person, berechne die Anzahl der unterschiedlichen Regionen

2) von den Personen, wähle diejenigen die mindestens eine region haben.

Das V1 erachte ich als unschön, man hätte einen sinnvollen Namen vergeben können (V, ist Standart).
Das kann sein, habe das package geladen.
Ok heißt das ich muss die Daten vorher irgendwie transformieren?
Ich habe sie mit dem package readstata13 (command read.dta 13) aus einem stata-file eingelesen.

Wird das V1 irgendwie on-the-fly generiert oder wie muss man sich das vorstellen? Im code wird es jedenfalls nicht explizit generiert.
Ich hatte den Eindruck als sollte der erste Teil das v1 generieren.

Sorry bin noch recht am Anfang in R. :roll:

VG

Re: subsetting

Verfasst: Do Nov 30, 2017 1:27 pm
von jogo
Hallo Serendipity,
serendipity hat geschrieben: Do Nov 30, 2017 12:53 pm Das kann sein, habe das package geladen.
Ok heißt das ich muss die Daten vorher irgendwie transformieren?
Ich habe sie mit dem package readstata13 (command read.dta 13) aus einem stata-file eingelesen.

Wird das V1 irgendwie on-the-fly generiert oder wie muss man sich das vorstellen? Im code wird es jedenfalls nicht explizit generiert.
Ich hatte den Eindruck als sollte der erste Teil das v1 generieren.
kannst Du bitte den Code zeigen bis zu der Zeile in der Fehler auftaucht?

Es sollte prinzipiell so aussehen:

Code: Alles auswählen

library("readstata13")
library("data.table")
data <- read.dta13(...)
setDT(data) # Umwandlung in ein data.table-Objekt
newvar = data[ ,length(unique(regionid)), personid][V1>0,personid]
Ob nach dem Einlesen der Daten in dem erzeugten Dataframe eine Spalte $V1 ist, kannst Du mit str(...) kontrollieren.

Gruß, Jörg

Re: subsetting

Verfasst: Do Nov 30, 2017 2:14 pm
von serendipity
setDT war hilfreich. Die Fehlermeldung ist jetzt anders aber immer noch da :?

Code: Alles auswählen


library("readstata13")
library("data.table")
data <- read.dta13(...)

a1data<-data
setDT(a1data) # Umwandlung in ein data.table-Objekt



#FUNKTION DEFINIEREN
########################
odata.vorber<- function(data) {
  
  # WER MIGRIERT
  mids = data[,length(unique(regionid)),personid][V1>0,personid]
  
  
  
  # EVENT DATEN GENERIEREN
  #behalte  alle zwei aufeinanderfolgenden Beobachtungen in  versch. Regionen
  odata = pdata[personid%in% mids]
  setkey(odata,personid,t)
  odata[, iobs := 1:.N, personid]
  setkey(odata,personid,iobs)
  odata[, regionid.p1 := odata[J(personid,iobs-1),regionid]]
  odata = odata[regionid!=regionid.p1]
  
  return(odata)
}

#FUNKTION AUSFÜHREN
########################
odata.vorber(a1data)

Error in odata.vorber(a1data) : object 'pdata' not found

Der Befehl sollte die Daten auf Basis der Bedingungen zweiteilen und den anderen Teil in pdata abspeichern.

Re: subsetting

Verfasst: Do Nov 30, 2017 4:11 pm
von bigben
serendipity hat geschrieben: Do Nov 30, 2017 2:14 pm setDT war hilfreich. Die Fehlermeldung ist jetzt anders aber immer noch da :?
Nö, jetzt ist eine andere Fehlermeldung da, die mit der vorher nichts zu tun hat.

Code: Alles auswählen

  odata = pdata[personid%in% mids]
[...]Der Befehl sollte die Daten auf Basis der Bedingungen zweiteilen und den anderen Teil in pdata abspeichern.

Das Gleichheitszeichen weist immer nur der Variablen links davon etwas zu. Das rechts davon ist das Zugewiesene. Da pdata nie auf der linken Seite eines Gleichheitszeichens steht, wird ihm auch nie etwas zugewiesen und R hat Recht, dass es niemandem den Wert von pdata zuweisen kann, wenn pdata vorher nicht definiert wurde.

LG,
Bernhard