Wert des Vorjahrs im nächsten Jahr vermerken

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

Moderatoren: EDi, jogo

Antworten
FledermausR
Beiträge: 21
Registriert: Fr Mär 23, 2018 11:24 am

Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von FledermausR »

Hallo,
ich habe eine wahrscheinlich gar nicht so schwierige Sache zu bewältigen, habe nur keine Ahnung wie.
Ich habe einen riesigen Datensatz aus Ringnummern von Fledermäusen (ring_nr). Dazu für jedes Jahr, indem die Fledermaus mit der Ringnummer X gelebt hat die Information, ob sie dort ein Jungtier hatte (birth_event = 0 oder 1). Es kommt aber auch vor, dass man das nicht weiß (birth_event = NA).

Ich bräuchte eine weitere Spalte, die mir für jede Ringnummer sagt, welcher Wert bei "birth_event" im Vorjahr steht bzw wenn es kein Vorjahr gibt (also wenn die Ringnummer das erste mal auftaucht) sollte NA da stehen.

Wie mache ich das am besten?

Code: Alles auswählen

structure(list(Year = c(1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 
1998L, 1999L, 1990L, 1995L, 1996L, 1995L, 1996L, 1997L, 1998L, 
1999L, 1994L, 1995L, 1996L, 1997L, 1995L, 1996L, 1995L, 1996L, 
1997L, 1994L, 1995L, 1996L, 1997L, 1998L), ring_nr = c("017172", 
"017172", "017172", "017172", "017172", "017172", "017172", "017172", 
"Z72356", "B01602", "B01602", "B01605", "B01605", "B01605", "B01605", 
"B01605", "B01607", "B01611", "B01611", "B01611", "B01613", "B01613", 
"B01614", "B01614", "B01614", "B01615", "B01615", "B01615", "B01615", 
"B01615"), birth_event = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 
NA, 1L, 1L, 1L, 1L, NA, 1L, 1L, 1L, 1L, 1L, NA, 1L, 0L, 1L, 1L, 
1L, 0L, NA, 1L, 1L)), row.names = c(NA, 30L), class = "data.frame")
Ich freue mich sehr über Hilfe,
Vielen Dank,
LG Bianca
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von jogo »

Hallo Bianca,

die Daten sind nach Ringnummer sortiert, richtig?
Sind für jede Ringnummer die Jahre fortlaufend - also ohne Lücke (fehlendes Jahr)?
(In Deinem kleinen Datenbeispiel ist das so, aber wie sieht es in dem großen Datensatz aus?)

Gruß, Jörg
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von Athomas »

Ich benutze dafür gerne "data.table" - es geht aber sicherlich auch ohne:

Code: Alles auswählen

library(data.table)

DT <- data.table(DF)
setkey(DT, Year, ring_nr)
DT[  , birth_PJ:=shift(birth_event, 1), by=ring_nr]
FledermausR
Beiträge: 21
Registriert: Fr Mär 23, 2018 11:24 am

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von FledermausR »

Yes, Danke an beide :)

@jogo: ja, die Jahre sind kontinuierlich, theoretisch darf keines pro Ringnummer fehlen.

@Athomas: das hat geklappt :)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von jogo »

FledermausR hat geschrieben: Mi Nov 18, 2020 12:33 pm @jogo: ja, die Jahre sind kontinuierlich, theoretisch darf keines pro Ringnummer fehlen.
ok, um es zu testen, kannst Du wie folgt vorgehen:

Code: Alles auswählen

library("data.table")

setDT(DT)
setkey(DT, Year, ring_nr)
DT[, any(diff(Year)!=1), by=ring_nr]
DT[-3, any(diff(Year)!=1), by=ring_nr] 
FledermausR
Beiträge: 21
Registriert: Fr Mär 23, 2018 11:24 am

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von FledermausR »

sorry, hier kommen die Fledermäuse nochmal aus der Kiste.
Wie wandel ich den code am besten ab, um eine Variable pro Ringnummer und Jahr zu erstellen, die mir sagt, wie viele Jungtiere die entsprechende Ringnummer in dem entsprechenden Jahr bereits hatte?

Also z.B. Ringnummer X

1990 birth event = 1 insgesamt = 0
1991 birth event = 0 insgesamt = 1
1992 birth event = 1 insgesamt = 1
1993 birth event = 1 insgesamt = 2
1994 birth event = NA insgesamt = 3
1995 birth event = 1 insgesamt = 3
1996 birth event = 1 insgesamt = 4

Vielen Dank nochmal !
LG
Bianca
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von Athomas »

Da Du offenbar NA als 0 wertest:

Code: Alles auswählen

library(data.table)

specsum <- function(x){
  x[is.na(x)] <- 0
  cumsum(x)
}

DT <- data.table(DF)
setkey(DT, Year, ring_nr)
DT[  , birth_PJ  := shift(birth_event, 1), by=ring_nr]
DT[  , insgesamt := specsum(birth_PJ)    , by=ring_nr]
FledermausR
Beiträge: 21
Registriert: Fr Mär 23, 2018 11:24 am

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Beitrag von FledermausR »

Supi, Danke :)
Antworten