Je voudrais calculer la différence entre les colonnes consécutives dans une gamme de colonnes à l'aide de DplyR.
Par exemple, en utilisant le jeu de données Sepal.Length Sepal.Width Petal.Length Petal.Width Species diff1 diff2
1 5.1 3.5 1.4 0.2 setosa 2.1 1.2
2 4.9 3.0 1.4 0.2 setosa 1.6 1.2
3 4.7 3.2 1.3 0.2 setosa 1.9 1.1
4 4.6 3.1 1.5 0.2 setosa 1.6 1.3
5 5.0 3.6 1.4 0.2 setosa 2.2 1.2
6 5.4 3.9 1.7 0.4 setosa 2.2 1.3
3 Réponses :
Voici une option avec Tidyverse code>. Nous
SELECT CODE> La gamme de colonnes, supprimez la première et dernière colonne dans une liste
code> de données.frames, puis utilisez
réduire code> pour obtenir la différence Entre ensemble de jeux de données de dimension égale et renommer les colonnes
map_dfc(3:4, ~ iris %>%
select(.x-1, .x) %>%
transmute(diff = reduce(., `-`))) %>%
bind_cols(iris, .)
Voulez-vous envisager de répertorier les packages spécifiques nécessaires ici? Il ressemble à dplyr code>,
Purrr code> et
stringr code>.
Voici une approche moins avancée utilisant dplyr code> et
titsyr code> verbes. D'abord, je rassemble les colonnes pour différencer dans un format long, puis prenez leurs différences contre la colonne précédente, désactivez NA de NA pour les premières colonnes qui n'ont aucune colonne précédente, renommez la colonne, étalées et joignez sur l'original.
library(tidyverse)
iris %>%
bind_cols(iris %>%
rowid_to_column() %>%
gather(col, val, Sepal.Width:Petal.Width) %>%
group_by(rowid) %>%
mutate(val = abs(val - lag(val))) %>%
filter(!is.na(val)) %>%
mutate(col = paste0("diff_", col)) %>%
spread(col, val) %>%
select(contains("diff"))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species rowid diff_Petal.Length diff_Petal.Width
1 5.1 3.5 1.4 0.2 setosa 1 2.1 1.2
2 4.9 3.0 1.4 0.2 setosa 2 1.6 1.2
3 4.7 3.2 1.3 0.2 setosa 3 1.9 1.1
4 4.6 3.1 1.5 0.2 setosa 4 1.6 1.3
5 5.0 3.6 1.4 0.2 setosa 5 2.2 1.2
6 5.4 3.9 1.7 0.4 setosa 6 2.2 1.3
7 4.6 3.4 1.4 0.3 setosa 7 2.0 1.1
Vous pouvez également utiliser grepl code> et
quel code> pour obtenir les indices de colonne.
merci@jgjiggle mais je cherchais une solution dplyr
La plage spécifiée commence avec Sepal.Width, la première différence est de 3,5 à 1,4.