R 在不指定存根的情况下从宽到长重塑形状

问题描述 投票:0回答:1
HAVE = fread("
STUDENT CLASS GROUP S1TIME S2TIME S3TIME H2TAB H4TAB H5TAB
1 0 2 NA NA 6 NA 7 5
2 0 7 4 NA 4 5 NA 2
3 1 5 NA 4 5 6 NA NA
")

WANT = data.frame(
  STUDENT = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3),
  INPUT = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5),
  CLASS = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1),
  GROUP = c(2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5),
  S.TIME = c(NA, NA, 6, NA, NA, 4, NA, 4, NA, NA, NA, 4, 5, NA, NA),
  H.TAB = c(NA, NA, NA, 7, 5, NA, 5, NA, NA, 2, NA, 6, NA, NA, NA)
)

是否可以在不指定“TIME、TAB”变量的情况下将 HAVE 转换为 WANT? 我希望提取随时间变化的存根并重塑完整数据

r data.table melt
1个回答
0
投票

这里有一个解决方案,可以旋转更长的时间,清理列,然后将其旋转为所需的形式。

library(tidyr)
library(magrittr)
    
temp <- HAVE %>% pivot_longer( cols=matches(".[[:digit:]]"), names_to = c("Name") , values_to = "value")

temp$INPUT <- gsub("\\D", "", temp$Name )
temp$Name <- gsub("\\d", ".", temp$Name )

answer <- temp %>% pivot_wider(names_from = "Name", values_from = "value")

我确信有一种方法可以在一行中执行此操作,但这更容易调试。

   STUDENT CLASS GROUP INPUT S.TIME H.TAB
     <int> <int> <int> <chr>  <int> <int>
 1       1     0     2 1         NA    NA
 2       1     0     2 2         NA    NA
 3       1     0     2 3          6    NA
 4       1     0     2 4         NA     7
 5       1     0     2 5         NA     5
 6       2     0     7 1          4    NA
 7       2     0     7 2         NA     5
 8       2     0     7 3          4    NA
 9       2     0     7 4         NA    NA
10       2     0     7 5         NA     2
11       3     1     5 1         NA    NA
12       3     1     5 2          4     6
13       3     1     5 3          5    NA
14       3     1     5 4         NA    NA
15       3     1     5 5         NA    NA
© www.soinside.com 2019 - 2024. All rights reserved.