0
votes

Comment calculer la différence entre les ensembles consécutifs de deux colonnes dans une plage de colonnes à l'aide de dplyr

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 IRIS STRT> IRIS, je voudrais être capable de spécifier la plage SEPAL.WIDTH: pétaal.width strong> et avoir un fichier de données contenant l'original IRIS STRAND> DONNÉES ET LES DIFFÉFENCES ENTRE LES COLONTES CONSECTIVUES DE SEPAL.WIDTH: PETAL.WIDTH: P>

  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


1 commentaires

La plage spécifiée commence avec Sepal.Width, la première différence est de 3,5 à 1,4.


3 Réponses :


1
votes

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, .)


1 commentaires

Voulez-vous envisager de répertorier les packages spécifiques nécessaires ici? Il ressemble à dplyr , Purrr et stringr .



2
votes

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


0 commentaires

0
votes

Vous pouvez également utiliser grepl et quel pour obtenir les indices de colonne. XXX


1 commentaires

merci@jgjiggle mais je cherchais une solution dplyr