如何使用 R 重塑一个聚集列中的多个值列

How to reshape using R for multiple value columns across one gather column

我想使用特定的列将我的数据从宽改造成长,但要创建多个值列。下面粘贴一个例子:

data <- read.table(header=T, text='
 hhid villageid hh_1   hh_2    age_1  age_2
   1   10        ab     pq      10      17
   2   12        cd     rs      11      25
   3   20        ef     tu      8       13
   4   22        gh     vw      9       3
 ')

#the output should gather hh_1:hh_2 to create two value columns

#    hhid villageid    member    name  age
 #     1    10           hh_1     ab    10
 #     1    10           hh_2     pq    17
 #     2    12           hh_1     cd    11
 #     2    12           hh_2     rs    25
 #     3    20           hh_1     ef     8
 #     3    20           hh_2     tu    13
 #     4    22           hh_1     gh     9
 #     4    22           hh_2     vw     3

我试过 dyplyr 包函数 gather 但没有成功。任何帮助,将不胜感激。谢谢

使用取代 gathertidyr::pivot_longer 以及您可以执行的一些额外的数据整理步骤:

library(tidyr)
library(dplyr)

data %>% 
  pivot_longer(-c(hhid, villageid), names_to = c(".value", "member"),
               names_pattern = "(.*)_(.*)") %>% 
  rename(name = "hh") %>% 
  mutate(member = paste("hh", member, sep = "_"))
#> # A tibble: 8 × 5
#>    hhid villageid member name    age
#>   <int>     <int> <chr>  <chr> <int>
#> 1     1        10 hh_1   ab       10
#> 2     1        10 hh_2   pq       17
#> 3     2        12 hh_1   cd       11
#> 4     2        12 hh_2   rs       25
#> 5     3        20 hh_1   ef        8
#> 6     3        20 hh_2   tu       13
#> 7     4        22 hh_1   gh        9
#> 8     4        22 hh_2   vw        3

使用 reshape

的基础 R 选项
reshape(
  data,
  direction = "long",
  idvar = c("hhid","villageid"),
  varying = -(1:2),
  sep = "_"
)

给予

       hhid villageid time hh age
1.10.1    1        10    1 ab  10
2.12.1    2        12    1 cd  11
3.20.1    3        20    1 ef   8
4.22.1    4        22    1 gh   9
1.10.2    1        10    2 pq  17
2.12.2    2        12    2 rs  25
3.20.2    3        20    2 tu  13
4.22.2    4        22    2 vw   3