web-dev-qa-db-fra.com

Fusionner plusieurs rangées dans r

J'ai actuellement des données sur lesquelles les gens ont répondu aux questions sur un comportement. Certaines questions constituent une déclaration globale sur le comportement passé et actuel (la condition) et d'autres questions posées sur le comportement en réponse à un certain cadrage de questions (condition X et Y).

Je veux fusionner ces lignes alors j'ai deux rangées pour chaque participant

  • Une ligne aura toutes leurs réponses aux conditions marquées "à la fois" et réponses à la condition "x"
  • Une autre ligne aura toutes leurs réponses aux conditions marquées "les deux et réponses à la condition" Y ".

J'ai essayé plusieurs solutions de regroupement et je ne peux pas sembler obtenir cela pour travailler. A également regardé ces réponses:

Et ni aucun de ces travaillaient non plus.

Exemple de code ci-dessous. Appréciez toute aide car pour le moment je suis réduit à copier-coller dans Excel qui n'est pas idéal.

library(tidyverse)
a <- 
  tibble(id = c(rep(1, 3), rep(2,3), rep(3, 3)) , condition = rep(c("both", "x", "y"),3), belief = c(4.8, NA, NA, 3.2, NA, NA, 6.5, NA, NA), past = c(1.8, NA, NA, 4.8, NA, NA, 2.6, NA, NA), current= c(1.8, NA, NA, 3.8, NA, NA, 3.1, NA, NA), feel = c(NA, .6, 1, NA, 2.1, 2.3, NA, 2.6, 1.5), willing = c(NA, 3.6, 205, NA, 2.1, 2.3, NA, 1.3, 0.3))

#what my data currently looks like
a
#> # A tibble: 9 × 7
#>      id condition belief  past current  feel willing
#>   <dbl> <chr>      <dbl> <dbl>   <dbl> <dbl>   <dbl>
#> 1     1 both         4.8   1.8     1.8  NA      NA  
#> 2     1 x           NA    NA      NA     0.6     3.6
#> 3     1 y           NA    NA      NA     1     205  
#> 4     2 both         3.2   4.8     3.8  NA      NA  
#> 5     2 x           NA    NA      NA     2.1     2.1
#> 6     2 y           NA    NA      NA     2.3     2.3
#> 7     3 both         6.5   2.6     3.1  NA      NA  
#> 8     3 x           NA    NA      NA     2.6     1.3
#> 9     3 y           NA    NA      NA     1.5     0.3

b <- 
  tibble(id = c(rep(1, 2), rep(2,2), rep(3, 2)), condition = rep(c("x", "y"),3), belief = c(4.8, 4.8, 3.2, 3.2, 6.5, 6.5), past = c(1.8, 1.8, 4.8, 4.8, 2.6, 2.6), current= c(1.8, 1.8, 3.8, 3.8, 3.1, 3.1), feel = c(.6, 1,  2.1, 2.3, 2.6, 1.5), willing = c( 3.6, 205,  2.1, 2.3,  1.3, 0.3))

#what I want my data to look like
b
#> # A tibble: 6 × 7
#>      id condition belief  past current  feel willing
#>   <dbl> <chr>      <dbl> <dbl>   <dbl> <dbl>   <dbl>
#> 1     1 x            4.8   1.8     1.8   0.6     3.6
#> 2     1 y            4.8   1.8     1.8   1     205  
#> 3     2 x            3.2   4.8     3.8   2.1     2.1
#> 4     2 y            3.2   4.8     3.8   2.3     2.3
#> 5     3 x            6.5   2.6     3.1   2.6     1.3
#> 6     3 y            6.5   2.6     3.1   1.5     0.3
2
Debra Lindsay

Considérons un groupe par fill, puis filter sorti de la ligne "à la fois"

library(dplyr)
library(tidyr)
out <- a %>%
   group_by(id) %>% 
   fill(belief:willing, .direction = "downup") %>%
   ungroup %>% 
   filter(condition != 'both')

-vérification

> identical(out, b)
[1] TRUE
3
akrun