subsetting

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

Moderatoren: EDi, jogo

Antworten
serendipity

subsetting

Beitrag 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!
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: subsetting

Beitrag 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).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
serendipity

Re: subsetting

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

Re: subsetting

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

Re: subsetting

Beitrag 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.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: subsetting

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten