【问题标题】:Difficulty with wide data frame in rr中宽数据框的困难
【发布时间】:2015-03-05 19:25:14
【问题描述】:

我有数据框(如下),其中包含在单次入院和不同入院期间收到不同诊断 (DX) 的病例 (ID)。我想扩大这个数据框,以便每次单独入院时,所有诊断都在单独的列中。我试过dplyrspread 函数,但它没有给出正确的结果。有什么建议吗?

ID   DX   Age   Admitted
1    a    17     3/2/14
1    b    17     3/2/14
1    c    17     4/30/14
2    e    20     7/22/13
2    a    20     7/22/13
2    c    20     7/22/13
2    d    20      2/4/14
3    b    16      4/18/14
4    e    16     10/8/13
4    m    16     10/8/13

预期的输出如下所示:

ID   DX1   DX2   DX3   Age   Admitted
1    a     b      NA    17     3/2/14
1    c     NA     NA    17     4/30/14
2    e     a      c     20     7/22/13
2    d     NA     NA    20      2/4/14
3    b     NA     NA    16      4/18/14
4    e     m      NA    16     10/8/13

【问题讨论】:

  • 您能否也显示预期的输出。可能是library(reshape2); dcast(df1, ID~DX, value.var='Admitted')
  • 还描述您需要处理的录取日期。
  • 宽格式,我不想要任何重复的录取日期
  • 糟糕!现在是正确的。

标签: r dplyr tidyr


【解决方案1】:

这可能有帮助

 df1$ind <- with(df1, paste0('DX',ave(seq_along(ID), 
                ID, Admitted, FUN=seq_along)))
 library(reshape2)
 dcast(df1, ...~ind, value.var='DX')
 #    ID Age Admitted DX1  DX2  DX3
 #1  1  17   3/2/14   a    b <NA>
 #2  1  17  4/30/14   c <NA> <NA>
 #3  2  20   2/4/14   d <NA> <NA>
 #4  2  20  7/22/13   e    a    c
 #5  3  16  4/18/14   b <NA> <NA>
 #6  4  16  10/8/13   e    m <NA>

或者

 library(dplyr)
 library(tidyr)
  df1 %>%
     group_by(ID, Admitted) %>%
     mutate(ind=paste0('DX', 1:n())) %>%
     ungroup() %>% 
     spread(ind, DX)
   #    ID Age Admitted DX1 DX2 DX3
   #1  1  17   3/2/14   a   b  NA
   #2  1  17  4/30/14   c  NA  NA
   #3  2  20   2/4/14   d  NA  NA
   #4  2  20  7/22/13   e   a   c
   #5  3  16  4/18/14   b  NA  NA
   #6  4  16  10/8/13   e   m  NA

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 4L, 4L), 
DX = c("a", "b", "c", "e", "a", "c", "d", "b", "e", "m"), 
Age = c(17L, 17L, 17L, 20L, 20L, 20L, 20L, 16L, 16L, 16L), 
Admitted = c("3/2/14", "3/2/14", "4/30/14", "7/22/13", "7/22/13", 
"7/22/13", "2/4/14", "4/18/14", "10/8/13", "10/8/13")),
.Names =   c("ID", 
"DX", "Age", "Admitted"), class = "data.frame", row.names = c(NA, 
-10L))

【讨论】:

  • @AliEslami 应该是版本差异的问题。我使用dplyr_0.4.0。您可以使用ungroup(),然后使用spread
  • 当我这样做时,每次录取只会产生一个 DX(第一个),并删除该录取的其他 DX(它不会为这些 Dx 添加额外的列)跨度>
  • @AliEslami 你说ungroup 以前有效吗?我无法重现您引用的问题。此外,这在dcast 中给出了相同的输出。不知道你用的是哪个版本的dplyr
  • 它的工作原理是不给出“错误:索引超出范围”。但是我上面提到的问题
  • @AliEslami dcast 方法怎么样?无论如何,我发布了我使用的dput 数据。只需复制/粘贴并尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多