【问题标题】:Transpose multiple variable data by group ini R在R中按组转置多个变量数据
【发布时间】:2022-01-10 06:18:36
【问题描述】:

我有这些数据:

 db <- read.table(header=T, text="
ID site R S data
1 1 2 10 01/02/2021
1 1 3 20 03/02/2021
1 2 4 50 05/01/2021
2 1 7 40 02/02/2021
2 2 2 30 05/02/2021
2 2 5 60 06/02/2021
2 2 9 10 07/02/2021
3 1 2 20 02/02/2021
3 2 6 30 03/02/2021
4 1 4 40 05/02/2021
5 1 5 20 07/02/2021")

我想得到以下结果:

db_transpose <- read.table(header=T, text="
ID site R S data R_1 S_1 data_1 R_2 S_2 data_2
1 1 2 10 01/02/2021 3 20 03/02/2021 NA NA NA
1 2 4 50 05/01/2021 NA NA NA NA NA NA
2 1 7 40 02/02/2021 NA NA NA NA NA NA
2 2 2 30 05/02/2021 5 60 06/02/2021 9 10 07/02/2021
3 1 2 20 02/02/2021 NA NA NA NA NA NA
3 2 6 30 03/02/2021 NA NA NA NA NA NA
4 1 4 40 05/02/2021 NA NA NA NA NA NA
5 1 5 20 07/02/2021 NA NA NA NA NA NA")

对于IDsite 列的每种组合,我想将RSdata 列中的数据按data 顺序转置。

我试过reshape2 没有结果。 这里尝试了S R 变量:

  require(reshape2)
  dcast(db, ID + site ~ data, value.var=c ("S", "R"))

但我收到此错误消息:

Error in .subset2(x, i, exact = exact) : index out of bounds
Warning message:
In if (!(value.var %in% names(data))) { :
  the condition has length > 1 and only the first element will be used

这里我只尝试了一个变量:

dcast(db, ID + site ~ data, value.var="S")
But I obtain a result totally different from what I need:
    ID site 01/02/2021 02/02/2021 03/02/2021 05/01/2021 05/02/2021 06/02/2021 07/02/2021
1  1 2         NA         NA         NA         50         NA         NA         NA
2  1 1         10         NA         20         NA         NA         NA         NA
3  2 1         NA         40         NA         NA         NA         NA         NA
4  2 2         NA         NA         NA         NA         30         60         10
5  3 1         NA         20         NA         NA         NA         NA         NA
6  3 2         NA         NA         30         NA         NA         NA         NA
7  4 1         NA         NA         NA         NA         40         NA         NA
8  5 1         NA         NA         NA         NA         NA         NA         20

谢谢

【问题讨论】:

  • 你能解释一下逻辑吗?在您的最终结果中,原始帧中的大多数数据都被忽略,例如第一行被忽略。为什么会这样?
  • @Onyambu 我有一份患者名单。每个患者 (ID) 都有一个或多个医院访问权限(站点)。在每次访问期间,患者都会进行两次检查。我需要为每位患者和 H-在一行中访问所有检查结果和数据。每一行都是一名患者和一个 H 访问权限,其中包含与该特定患者/访问权限相关的所有信息。
  • 那你的预期结果不正确?
  • no.....你知道我可以获得db_transpose数据吗?
  • 查看答案

标签: r data-manipulation


【解决方案1】:

在基数 R >= 4:

transform(db, time = ave(ID, ID, site, FUN = seq_along)) |>
  reshape(dir = 'wide', idvar = c('ID', 'site'), sep = '_')

   ID site R_1 S_1     data_1 R_2 S_2     data_2 R_3 S_3     data_3
1   1 1234   2  10 01/02/2021   3  20 03/02/2021  NA  NA       <NA>
3   1 1224   4  50 05/01/2021  NA  NA       <NA>  NA  NA       <NA>
4   2 1234   7  40 02/02/2021  NA  NA       <NA>  NA  NA       <NA>
5   2 1342   2  30 05/02/2021   5  60 06/02/2021   9  10 07/02/2021
8   3 1234   2  20 02/02/2021  NA  NA       <NA>  NA  NA       <NA>
9   3 3421   6  30 03/02/2021  NA  NA       <NA>  NA  NA       <NA>
10  4 1234   4  40 05/02/2021  NA  NA       <NA>  NA  NA       <NA>
11  5 1234   5  20 07/02/2021  NA  NA       <NA>  NA  NA       <NA>

在基础 R

  reshape(transform(db, time = ave(ID, ID, site, FUN = seq_along)),
          dir = 'wide', idvar = c('ID', 'site'), sep = '_')

在tidyverse中:

library(tidyverse)
db %>%
  group_by(ID, site) %>%
  mutate(name = row_number())%>%
  pivot_wider(c(ID, site), values_from = c(R,S,data), names_sep = '_')

# A tibble: 8 x 11
# Groups:   ID, site [8]
     ID  site   R_1   R_2   R_3   S_1   S_2   S_3 data_1     data_2     data_3    
  <int> <int> <int> <int> <int> <int> <int> <int> <chr>      <chr>      <chr>     
1     1  1234     2     3    NA    10    20    NA 01/02/2021 03/02/2021 NA        
2     1  1224     4    NA    NA    50    NA    NA 05/01/2021 NA         NA        
3     2  1234     7    NA    NA    40    NA    NA 02/02/2021 NA         NA        
4     2  1342     2     5     9    30    60    10 05/02/2021 06/02/2021 07/02/2021
5     3  1234     2    NA    NA    20    NA    NA 02/02/2021 NA         NA        
6     3  3421     6    NA    NA    30    NA    NA 03/02/2021 NA         NA        
7     4  1234     4    NA    NA    40    NA    NA 05/02/2021 NA         NA        
8     5  1234     5    NA    NA    20    NA    NA 07/02/2021 NA         NA    

带有数据表:

library(data.table)
dcast(setDT(db), ID + site ~ rowid(ID, site), value.var = c('R', 'S', 'data'),sep = '_')
   ID site R_1 R_2 R_3 S_1 S_2 S_3     data_1     data_2     data_3
1:  1 1224   4  NA  NA  50  NA  NA 05/01/2021       <NA>       <NA>
2:  1 1234   2   3  NA  10  20  NA 01/02/2021 03/02/2021       <NA>
3:  2 1234   7  NA  NA  40  NA  NA 02/02/2021       <NA>       <NA>
4:  2 1342   2   5   9  30  60  10 05/02/2021 06/02/2021 07/02/2021
5:  3 1234   2  NA  NA  20  NA  NA 02/02/2021       <NA>       <NA>
6:  3 3421   6  NA  NA  30  NA  NA 03/02/2021       <NA>       <NA>
7:  4 1234   4  NA  NA  40  NA  NA 05/02/2021       <NA>       <NA>
8:  5 1234   5  NA  NA  20  NA  NA 07/02/2021       <NA>       <NA>

【讨论】:

  • 我收到此错误消息:Error: unexpected '&gt;' in "transform(db, time = ave(ID, ID, site, FUN = seq_along)) |&gt;"Error in reshape(dir = "wide", idvar = c("ID", "site")) : l'argomento "data" non è specificato e non ha un valore predefinito
  • tidyverse 这很好用……太棒了!!赞美!!
  • 那是因为您使用的是旧版本的 R. chenck the edit
  • 我对 (tidyr) 和 (dplyr) 也有问题:同样的原因?太感谢了!!你救了我!!
  • @ArTu 你是什么意思?您还有问题吗?
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2020-03-08
  • 2020-08-15
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多