Seite 3 von 4

Re: Net Squared Displacement

Verfasst: Do Sep 08, 2022 9:05 pm
von student
Schau Dir bitte noch einmal diese Code-Zeile genau an:
nsdplot <- xyplot (nsdall ~ zerostart/3600, data = datansd1, col = "grey", type = 'b', ylab = expression paste"

Re: Net Squared Displacement

Verfasst: Fr Sep 09, 2022 6:13 am
von Arthemisia
Ja, genau das zeigt R in der Fehlermeldung an, aber wie korrigiere ich das?

Das hier ist die entsprechende Zeile aus dem Original-Skript:

nsdplot <- xyplot (nsdall ~ zerostart/3600, data = datansd1, col = "grey", type = 'b', ylab = expression paste('Net squared displacement ', ' ', (km^2))), xlab = "Hours after trip start")
plot (nsdplot)

Re: Net Squared Displacement

Verfasst: Fr Sep 09, 2022 8:00 am
von bigben
Hi!

expression ist eine Funktion und wie üblich erwartet diese Funktion, dass nach ihrem Namen eine Klammer aufgeht und in der Klammer das oder die Argumente stehen. Stattdessen steht da mit paste der nächste Funktionsname, und das versteht R natürlich nicht. Außerdem gilt der banale Satz, dass in einem Kommando immer genausoviele Klammern auf wie zu gemacht werden müssen, was hier nicht geschieht. Ich vermute mal, dass man einfach nur zwischen expression und paste eine Klammer auf machen müsste, aber um das auszuprobieren müsste man geeignete Musterdaten haben.

LG,
Bernhard

Re: Net Squared Displacement

Verfasst: Fr Sep 09, 2022 8:12 am
von Athomas
Hier die "richtigen" Originalzeilen, vollständig und etwas anders formatiert:

Code: Alles auswählen

nsdplot <- xyplot(nsdall ~ zerostart/3600, data=datansd1, col="grey", 				#color for the observed locations
type='b',											# 'b' shows the locations as dots, with a line connecting
												#successive locations. Can also be 'p' for just the locations, or 'l' for just
												#the line between locations
ylab=expression(paste('Net squared displacement ',' ', (km^2))),				#y axis label
xlab="Hours after trip start")
plot(nsdplot)

Re: Net Squared Displacement

Verfasst: Fr Sep 09, 2022 9:51 am
von Athomas
Zu dem ganzen "Kapitel 3" gibt es ein PDF-Skript, das zwar nicht gut, aber besser :) lesbar ist: https://ecosystems.psu.edu/research/lab ... ink-to-pdf

Re: Net Squared Displacement

Verfasst: Mo Sep 12, 2022 8:58 am
von Arthemisia
Hallo,
nachdem das Problem mit dem Zeitstempel endlich gelöst ist, läuft das Skript bis hierhin fehlerfrei:

Code: Alles auswählen

Duemmer$NewDate <- as.POSIXct(Duemmer$timestamp, format="%Y-%m-%d %H:%M:%S", origin="1970-01-01")
timediffD <- diff(Duemmer$NewDate)*60*60
Duemmer <- Duemmer [-1,]

Duemmer$timelag <-as.numeric(abs(timediffD))
summary(Duemmer$timelag)
# Duemmer <- subset(Duemmer, Duemmer$timelag < 18000)

Duemmer $Year <- format(Duemmer $NewDate, "%Y")
# Duemmer <- subset(Duemmer, Duemmer $Year != "NA")
Duemmer $YearBurst <- c(paste(Duemmer $trackId, Duemmer $Year, sep="_"))
Duemmer $YearBurst <- as.factor(Duemmer $YearBurst)
str(Duemmer)
summary(Duemmer $YearBurst)
Duemmer <- subset(Duemmer, table(Duemmer $YearBurst)[ Duemmer $YearBurst] > 100)
Duemmer $YearBurst <- factor(Duemmer $YearBurst)

Dd1 <- Duemmer
str(Dd1)
indataD <-Dd1
innamesD <- unique(Dd1$ YearBurst)
innamesD <- innamesD [1:22]
outnamesD <- innamesD
Jetzt hängt es an der nächsten Stelle:

Code: Alles auswählen

for (i in 1:length(innamesD)){
  data <- indataD [which(indataD$YearBurst==innamesD[i]),]
  if(dim(data)[1] != 0){
  data.xy = data [c("X", "Y")]
  coordinates(data.xy) <- ~X+Y    
  sppt <- SpatialPointsDataFrame(coordinates(data.xy), data)
  proj4string(sppt) <- CRS("+proj=utm +zone=12 +datum=WGS84")
  write.table(sppt, paste(outnamesD[i], "txt", sep="."), sep="\t", quote=FALSE, row.names=FALSE)
  write.table(paste(outnamesD[i], "txt", sep="."), sep="\t", quote=FALSE, row.names=FALSE, col.names=FALSE, "In_list.txt", append=TRUE)
}}
Wenn ich das laufen lasse, bekomme ich diese Fehlermeldung:
Fehler in `[.data.frame`(data, c("X", "Y")) :
nicht definierte Spalten gewählt

Wo hängt es denn jetzt? Allmählich bin ich nur noch :oops: , ich will damit einfach nur noch fertig werden !!!

Re: Net Squared Displacement

Verfasst: Mo Sep 12, 2022 9:47 am
von jogo
hm, in einem Dataframe ist doch die zweite Dimension für die Spalten zuständig; etwa so?

Code: Alles auswählen

 data.xy = data [, c("X", "Y")]
Gruß, Jörg

Re: Net Squared Displacement

Verfasst: Mo Sep 12, 2022 10:55 am
von bigben
Hallo Jörg,

das war auch mein erster Gedanke. Tatsächlich scheint R damit aber kein Problem zu haben:

Code: Alles auswählen

bsp <- data.frame(X = 1:3, 
                  Y = 2:4,
                  Z = 3:5)
bsp[c("X", "Y")] 
#>   X Y
#> 1 1 2
#> 2 2 3
#> 3 3 4

LG,
Bernhard


Nachtrag: Ok, da muss man erstmal drauf kommen: Diese Syntax ist völlig in Ordnung für "richtige" data.frames, aber sie funktioniert nicht mit data.tables:

Code: Alles auswählen

library(data.table)
bsp <- data.table(X = 1:3, 
                  Y = 2:4,
                  Z = 3:5)
bsp[c("X", "Y")] 
#> Error in `[.data.table`(bsp, c("X", "Y")): When i is a data.table (or character vector), the columns to join by must be specified using 'on=' argument (see ?data.table), by keying x (i.e. sorted, and, marked as sorted, see ?setkey), or by sharing column names between x and i (i.e., a natural join). Keyed joins might have further speed benefits on very large data due to x being sorted in RAM.
Arthemisia: Versuch mal, knapp vor Auftreten des Fehlers Deinen data.table in eine "richtigen" data.frame umzuwandeln. Das geht mit

Code: Alles auswählen

data <- as.data.frame(data)

Re: Net Squared Displacement

Verfasst: Mo Sep 12, 2022 11:41 am
von jogo
Hallo Bernhard,
bigben hat geschrieben: Mo Sep 12, 2022 10:55 am
Nachtrag: Ok, da muss man erstmal drauf kommen: Diese Syntax ist völlig in Ordnung für "richtige" data.frames, aber sie funktioniert nicht mit data.tables: ...
das war nun wieder mein ursprünglicher Gedanke, da Arthemisia gelegentlich mit data.table arbeitet. Aber dort steht ja in der Fehlermeldung:
Fehler in `[.data.frame`(data, c("X", "Y")) :
nicht definierte Spalten gewählt


Bei einem reproduzierbaren Beispiel mit entsprechenden Daten könnte man wirklich konkret antworten.

Gruß, Jörg

Re: Net Squared Displacement

Verfasst: Mo Sep 12, 2022 4:26 pm
von Arthemisia
Ich nehme an, es soll ein neues Data Frame erzeugt werden, mit den Spalten X und Y, und in die Zeilen soll dann jeweils nach jedem Durchlauf der For-Schleife das Ergebnis eingetragen werden.
Das würde Sinn machen, da für jedes Tier einzeln die Migrationsbewegungen im Jahresverlauf kumuliert aufgetragen werden sollen, auf der x-Achse die Monate, auf der y-Achse die Entfernung. Es gibt vorher auch noch keinen data Frame, der im Original-Skript mit "data" oder "data.xy" benannt worden ist.