对于每个重复的情况,将日期从长格式移动到宽格式

时间:2017-05-22 14:26:41

标签: r date casting spss

好的,我有以下数据;一个人的身份,他们所在城市的代码,然后是我的服务推荐日期。

    id <- c (1,2,3,2,5,2,7,8,9)
    locale <- c(123,433,214,433,632,433,647,345,234)
    referraldate <- sample(seq(as.Date("1999/01/01"), as.Date("2017/05/22"), by="day"), 9)
    data <- data.frame(id, locale, referraldate)

有些人不止一次来到这项服务,因此重复的身份证和城市代码。

  id locale referraldate
1  1    123   2002-11-09
2  2    433   1999-06-04
3  3    214   2015-12-19
4  2    433   2012-10-13
5  5    632   2003-09-17
6  2    433   2000-07-06
7  7    647   2015-12-28
8  8    345   1999-07-22
9  9    234   2006-05-25

我不想为每个引荐设置单独的行,而是希望获取此数据并将日期转换为每人的列数(每个引荐一列)。所以每个案例都会有“ReferralDate”,“ReferralDate2”,“ReferralDate3”列。

我尝试过使用reshape2和data.table包中的dcast,但我怀疑这些更好地用于数据,例如因素,这些数据不是无限的。

理想情况下,为所有非id定义的变量(如果适用)执行此操作的解决方案将非常方便。在SPSS(我正在转换)中,执行此操作的函数是CASESTOVARS。

3 个答案:

答案 0 :(得分:1)

此类问题的关键是要认识到您需要创建一个新变量来跟踪观察的引用:

library(tidyverse)
data %>% 
   group_by(id) %>%
   mutate(n_visit=paste0("ReferalDate", row_number())) %>%
   spread(n_visit, referraldate)

我们按ID对数据进行分组以获取每个人的历史记录,我们创建一个包含引荐号的新列,并使用spread来生成宽格式的数据。

答案 1 :(得分:0)

在SPSS中,

casestovars还不够 - 您需要先创建一个索引变量,将每个人的推荐日期编号为第一,第二,第三等等。您使用casestovars并将所有第一个日期转换为变量,将所有第二个日期转换为变量等&#39;。
我怀疑R中的重组命令会有同样的事情。

答案 2 :(得分:0)

您似乎尝试从长到大的数据,因此reshapedata.table是您最好的选择。但在此之前,您需要创建一个索引变量:

data.new <- data %>%
            group_by(id, locale) %>%
            mutate(ReferralDate = paste0("ReferralDate", row_number()) %>%
            spread(ReferralDate, referraldate)

我不确定你是否也希望保留locale。因此,您可能希望将其分组,以防万一。