tidyr的spread函数无法返回日期。

5

抱歉,我是一个相对初学者,希望通过dplyr技术实现更多功能。我有一个包含id列、end列(日期格式为POSIXct)和D列(编码了大约6种不同类型结果)的大型数据框,示例如下:

   id        end  D
 1143 1996-08-10 KT
 1148 2000-07-27 KT
 1150 2004-07-02 KT
 1158 2001-11-03 KT

我希望创建一个关于KT结果的子集。在这个结果范围内,许多id都有1-4个不同日期的结果。我需要创建一个宽数据框,看起来像这样:
   id    datetx1    datetx2    datetx3    datetx4
 1915 2014-10-13 2014-10-18       <NA>       <NA>
 2715 2006-09-17 2006-09-17 2006-09-17 2008-02-01
 5089 2007-02-02 2007-02-11       <NA>       <NA>
 5266 2007-04-16 2010-07-14 2010-07-14       <NA>

我一直在试着使用dplyr和tidyr来进行长宽转换,虽然这种方法有些成功,但在处理日期时遇到了困难:

transplant<-filter(outcomes, D == "KT") %>%
  filter(!is.na(date)) %>%
  group_by(id) %>%
  arrange((end)) %>%
  mutate(number = row_number()) %>%
  spread(number, date) 

问题出在spread函数上,它会在其他列中创建数值型的值,我无法将其转换为日期格式。我只能将日期先转换为字符型,然后在使用spread后再转换为日期格式。这种方法虽然可行,但是我是否遗漏了tidyr和日期编码方面的知识?


我想我前几天也遇到了同样的问题。最后我将字符转换为日期对象。检查GitHub上的新闻可能会有价值。 - jazzurro
spread 应该有一个默认值为 FALSE 的 convert 参数。尝试使用 convert = TRUE - npjc
谢谢。convert = FALSE没有起作用,所以我将继续使用将日期编码为字符的方法。 - Martin Wolley
1
看起来这里的根本问题已经解决了;我无法复现它,并且这个示例尤其令人困惑,因为它使用了一个在样本数据中不存在的date作为列。 - user295691
1个回答

1
R和dplyr在这个问题最初发布后已经有了很大的进展。spread已经被pivot_wider取代,这是我在这个答案中将要使用的函数。
# recreation of the data used in the question
df <- structure(list(id = c(1915, 1915, 2715, 2715, 2715, 2715, 5089, 
5089, 5266, 5266, 5266), end = structure(c(16356, 16361, 13408, 
13408, 13408, 13910, 13546, 13555, 13619, 14804, 14804), class = "Date"), 
    D = c("KT", "KT", "KT", "KT", "KT", "KT", "KT", "KT", "KT", 
    "KT", "KT")), row.names = c(NA, -11L), class = c("tbl_df", 
"tbl", "data.frame"))


df %>%
    filter(D == "KT") %>%
    group_by(id) %>%
    select(-D) %>%
    mutate(n = row_number()) %>%
    pivot_wider(values_from = end, names_from = n, names_prefix = "datetx_")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接