Seite 1 von 1

Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Nov 18, 2020 10:45 am
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

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Nov 18, 2020 11:47 am
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

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Nov 18, 2020 11:48 am
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]

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Nov 18, 2020 12:33 pm
von FledermausR
Yes, Danke an beide :)

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

@Athomas: das hat geklappt :)

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Nov 18, 2020 1:05 pm
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] 

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Dez 02, 2020 8:47 am
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

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Mi Dez 02, 2020 10:49 am
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]

Re: Wert des Vorjahrs im nächsten Jahr vermerken

Verfasst: Fr Dez 04, 2020 12:42 pm
von FledermausR
Supi, Danke :)