преобразовать широкий набор данных в длинный в R

      set.seed(123)
dataset <- data.frame(ID = 1:10,
                      height_1 = rnorm(10,0,1),
                      height_2 = rnorm(10,0,1),
                      common_fam = rnorm(10,0,1),
                      weight_1 = rnorm(10,0,1),
                      weight_2 = rnorm(10,0,1),
                      common2_fam2 = rnorm(10,0,1))

Итак, вышеприведенное представляет собой воспроизводимый пример минимальных данных. мои реальные данные сложнее.

      data3 <- dataset %>%
  pivot_longer(-c('ID', ends_with("fam") | ends_with("fam2")),
               names_to = "fID", 
               values_to = "value",
               names_sep = "_")

Я имел в виду, что

data3 содержит такие столбцы, как:

      "ID", "common_fam", "common2_fam2", 
"fID" (it contains values either 1 or 2), 
"height" and "weight"

1 ответ

Я думаю, это то, что вы ищете:

      library(dplyr)
library(tidyr)

set.seed(123)
dataset <- data.frame(ID = 1:10,
                      height_1 = rnorm(10,0,1),
                      height_2 = rnorm(10,0,1),
                      common_fam = rnorm(10,0,1),
                      weight_1 = rnorm(10,0,1),
                      weight_2 = rnorm(10,0,1),
                      common2_fam2 = rnorm(10,0,1))

data3 <- dataset %>%
   pivot_longer(-c('ID', contains("fam") ),
                names_to = c(".value", "fID"), 
                values_to = "value",
                names_sep = "_")

data3
# A tibble: 20 × 6
     ID common_fam common2_fam2 fID    height  weight
  <int>      <dbl>        <dbl> <chr>   <dbl>   <dbl>
1     1     -1.07        0.253  1     -0.560   0.426 
2     1     -1.07        0.253  2      1.22   -0.695 
3     2     -0.218      -0.0285 1     -0.230  -0.295 
4     2     -0.218      -0.0285 2      0.360  -0.208 
5     3     -1.03       -0.0429 1      1.56    0.895 
6     3     -1.03       -0.0429 2      0.401  -1.27  
...
Другие вопросы по тегам