J'essaie de soustraire les valeurs d'une colonne en fonction des variables de deux autres colonnes. Cela est rendu plus compliqué car tous les « ID » ne se trouvent pas sur tous les sites avant et après. Voici un exemple de bloc de données :
> time <- c("before", "after", "before", "after", "before", "after", "before")
> site <- c("red", "red","red", "red","green", "green", "blue")
> ID <- c('A','A','B','B','B','B','C')
> cover <- c('10','5','10','5','10','5','3')
> df <- data.frame(time, site, ID, cover)
time site ID cover
1 before red A 10
2 after red A 5
3 before red B 10
4 after red B 5
5 before green B 10
6 after green B 5
7 before blue C 3
Vous pouvez voir que 'C' n'apparaît qu'en bleu auparavant. Le résultat ressemblerait à ceci :
site ID diff
1 red A -5
2 red B -5
3 green B -5
4 blue C <NA>
J'ai essayé ce code trouvé sur un autre post de débordement de pile avec une question similaire, mais je n'arrive pas à le faire fonctionner.
df_new <- df %>% group_by(time, site, ID) %>%
summarise(diff = cover[time == c("after")] - cover[time == c("before")])
Une idée où je me trompe?
Merci!
On peut faire un group by diff
à condition de vérifier avec unif/else
library(dplyr)
df %>%
group_by(site, ID) %>%
summarise(diff = if(length(cover) == 1) NA
else diff(cover), .groups = 'drop')
-sortir
# A tibble: 4 x 3
site ID diff
<chr> <chr> <dbl>
1 blue C NA
2 green B -5
3 red A -5
4 red B -5
Le code d'origine d'OP ne fonctionne pas car l'un des groupes n'a pas à la fois « après » et « avant » dans « temps ». Nous devrons peut-être spécifier une if/else
condition pour cela
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots