J'utilise la fonction de la journée dans le paquet Geosphe pour calculer la longueur de la journée à un endroit entre deux points. En fonction de l'individu spécifique et de l'emplacement, dans le nombre de jours sur lesquels je suis en moyenne la longueur de la journée varie.
Bien que ma fonction fonctionne lorsque je les variables de code durs (c.-à-d. Fournir une valeur spécifique pour la date et la date), Ne fonctionne pas lorsque je fournis un vecteur de valeurs et obtenez les messages d'erreur et d'avertissement suivants: p> Je sais que cette erreur concerne mes calculs de la longueur de jour car l'autre partie du code fonctionne bien quand il est omis. p> Mon code et un sous-ensemble de données (c'est-à-dire les 25 premières observations): P> df %>%
mutate(mean.lat = if_else((ID == lag(ID) & site != lag(site)),
(lat + lag(lat))/2, NA_real_),
doy.prev = if_else((ID == lag(ID) &
site != lag(site)),
lag(yday(ts)),
NA_real_),
mean.day = if_else((ID == lag(ID) &
site != lag(site) &
yday(ts) != yday(lag(ts)) &
!is.na(mean.lat) &
!is.na(doy.prev)),
mean(daylength(mean.lat, doy.prev:doy)),
timeS))
dput(df)
structure(list(ID = structure(c(1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 8L,
8L), .Label = c("NB2014.12", "NB2014.13", "NB2014.14", "NB2014.15",
"NB2014.16", "NB2014.42", "NB2014.43", "NB2014.44", "NB2014.45",
"NB2014.47", "NB2014.48", "NB2014.49", "NB2014.70", "NB2014.71",
"NB2014.72", "NB2014.73", "NB2014.74", "NB2014.75", "NB2014.76",
"NB2014.77", "NB2014.78", "NB2014.79", "NB2014.80", "NB2014.81",
"NB2015.156", "NB2015.157", "NB2015.158", "NB2015.159", "NB2015.160",
"NB2015.312", "NB2015.313", "NB2015.314", "NB2015.315", "NB2015.316",
"NB2015.317", "NB2015.318", "NB2015.320", "NB2015.321", "NB2015.322",
"NB2015.323", "NB2015.324", "NB2015.325", "NB2015.326", "NB2015.327",
"NB2015.328", "NB2015.329", "NB2015.330", "NB2015.331", "NB2015.332",
"NB2015.333", "NB2015.334", "NB2015.335", "NB2015.336", "NB2015.337",
"NB2015.338", "NB2015.339", "NB2015.340", "NB2015.341", "NB2015.342",
"NB2015.343", "NB2015.344", "NB2015.345", "NB2015.346", "NB2015.347",
"NB2015.348", "NB2015.349", "NB2015.350", "NB2015.351", "NB2018.10",
"NB2018.11", "NB2018.12", "NB2018.13", "NB2018.14", "NB2018.15",
"NB2018.16", "NB2018.17", "NB2018.18", "NB2018.19", "NB2018.20",
"NB2018.21", "NB2018.22", "NB2018.23", "NB2018.24", "NB2018.25",
"NB2018.26", "NB2018.27", "NB2018.28", "NB2018.29", "NB2018.30",
"NB2018.31", "NB2018.32", "NB2018.33", "NB2018.34", "NB2018.35",
"NB2018.37", "NB2018.38", "NB2018.39", "NB2018.40", "NB2018.41",
"NB2018.42", "NB2018.43", "NB2018.44", "NB2018.45", "NB2018.46",
"NB2018.47", "NB2018.48", "NB2018.49", "NB2018.5", "NB2018.50",
"NB2018.51", "NB2018.52", "NB2018.53", "NB2018.54", "NB2018.55",
"NB2018.56", "NB2018.57", "NB2018.58", "NB2018.59", "NB2018.6",
"NB2018.60", "NB2018.61", "NB2018.62", "NB2018.63", "NB2018.64",
"NB2018.7", "NB2018.8", "NB2018.9"), class = "factor"), site = c("Tantramar",
"Tantramar", "HPWLR", "Tantramar", "Beaubassin", "Marsh Landings",
"Eddie rd. ", "Marsh Landings", "Marsh Landings", "Marsh Landings",
"Eddie rd. ", "Beaubassin", "AMHRST", "HPWLR", "Tantramar", "Tantramar",
"Fork Field Farms", "WNERR", "GB_ferryway", "GB_thomas", "Tantramar",
"HPWLR", "Tantramar", "Tantramar", "Marsh Landings"), lat = c(45.900303030303,
45.900303030303, 45.83, 45.900303030303, 45.85, 45.85, 45.85,
45.85, 45.85, 45.85, 45.85, 45.85, 45.79, 45.83, 45.900303030303,
45.900303030303, 45.94, 43.34, 43.09, 43.08, 45.900303030303,
45.83, 45.900303030303, 45.900303030303, 45.85), doy = c(213,
206, 206, 217, 217, 217, 217, 217, 218, 218, 218, 218, 218, 218,
194, 206, 207, 211, 211, 211, 220, 220, 207, 210, 210), ts = structure(c(1406899801.4133,
1406297348.1112, 1406299522.4141, 1407276094.4158, 1407277417.7616,
1407279028.1764, 1407279972.1813, 1407281880.08955, 1407285413.4387,
1407314856.6032, 1407315906.52065, 1407316678.29125, 1407316887.28,
1407319828.1424, 1405278154.7126, 1406330632.0613, 1406364501.8284,
1406713079.0338, 1406716251.3933, 1406716449.5783, 1407490305.4993,
1407491817.085, 1406370738.3239, 1406655731.0996, 1406673688.1819
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), timeS = c(NA,
NA, 2174.30289983749, NA, 1323.34579992294, 1610.41479992867,
944.004900217056, 1907.90824985504, NA, NA, 1049.91744995117,
771.77060008049, 208.988749980927, 2940.86240005493, NA, NA,
33869.7670998573, 348577.20539999, 3172.35950016975, 198.18499994278,
NA, 1511.5857000351, NA, NA, 17957.0822999477)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -25L))
3 Réponses :
J'ai ajouté un filtre supplémentaire et cela a donné ci-dessous des avertissements. Cela donne-t-il un indice?
df %>% mutate(mean.lat = if_else((ID == lag(ID) & site != lag(site)), (lat + lag(lat))/2, NA_real_), doy.prev = if_else((ID == lag(ID) & site != lag(site)), lag(yday(ts)), NA_real_)) %>% filter(!is.na(doy.prev)) %>% mutate(mean.day = if_else(((ID == lag(ID) & site != lag(site) & yday(ts) != yday(lag(ts))) & !is.na(mean.lat) & !is.na(doy.prev)), mean(daylength(mean.lat, doy.prev:doy)), timeS)) 12 NB2014.16 GB_ferryway 43.1 211 2014-07-30 10:30:51 3172. 43.2 211 3172. 13 NB2014.16 GB_thomas 43.1 211 2014-07-30 10:34:09 198. 43.1 211 198. 14 NB2014.42 HPWLR 45.8 220 2014-08-08 09:56:57 1512. 45.9 220 1512. 15 NB2014.44 Marsh Landings 45.8 210 2014-07-29 22:41:28 17957. 45.9 210 17957. Warning messages: 1: In doy.prev:doy : numerical expression has 15 elements: only the first used 2: In doy.prev:doy : numerical expression has 15 elements: only the first used
Malheureusement, non, cela n'a pas beaucoup de sens pour moi. Je ne veux pas inclure le filtre car j'ai besoin de toutes les données pour un calcul ultérieur. En outre, sans les rangées précédentes, il est difficile pour moi de confirmer que le code fait ce que je veux. Basé sur ma feuille de calcul complète, les deux premières lignes sont définitivement erronées car l'individu a été observé deux fois le même jour. Il suffit de calculer la ligne de la journée lorsque des observations consécutives pour le même individu (ID == Lag (ID)) sont pour deux emplacements différents (site! = Lag (site)) sur deux jours différents (yday (TS)! = yday (TS)).
Lorsque je substitue une valeur inoffensive pour la fonction de la journée de la journée, je vois que les seules personnes qui devraient obtenir un calcul de la longueur de jour (dans les 25 premières lignes) sont des rangées 17 et 18 (NB2014.16 chez Wnerr et GB_Ferryway).
J'étais incapable de trouver un moyen d'obtenir la fonction de la journée de travail à travailler dans dplyr. Cependant, voici une œuvre autour:
df2 <- df %>% filter(!is.na(meanLat)) df2$timeHday = apply((df2 %>% select(meanLat, doy.local, doy.prev1)), 1, function(x) sum(daylength(x[1], x[3]:x[2]))) df <- df %>% left_join(df2, by = c("ID", "ts.mn"))
dans le plain r:
Quelle valeur vous attendez-vous au
doy.prev code> à avoir au lieu de NA, puisque la journée de la journée donnera cette erreur si
doy code> contient na?
@Sonny si Doy = na, alors je n'ai pas besoin du calcul de la journée. C'est pourquoi j'ai ajouté! is.na (doy.prev) à la déclaration IF_ELSE.
Mais vous avez utilisé et conditionner, donc cela ignorera ces lignes où tout n'est pas NA.
Désolé @sonny, je ne suis pas suivi de votre point. Pour moi! Is.na (doy.prev) signifie n'incluant aucune valeur dans laquelle DOY.PREV = NA.