好的,我有以下数据;一个人的身份,他们所在城市的代码,然后是我的服务推荐日期。
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。
答案 0 :(得分:1)
此类问题的关键是要认识到您需要创建一个新变量来跟踪观察的引用:
library(tidyverse)
data %>%
group_by(id) %>%
mutate(n_visit=paste0("ReferalDate", row_number())) %>%
spread(n_visit, referraldate)
我们按ID对数据进行分组以获取每个人的历史记录,我们创建一个包含引荐号的新列,并使用spread来生成宽格式的数据。
答案 1 :(得分:0)
casestovars
还不够 - 您需要先创建一个索引变量,将每个人的推荐日期编号为第一,第二,第三等等。您使用casestovars
并将所有第一个日期转换为变量,将所有第二个日期转换为变量等&#39;。
我怀疑R中的重组命令会有同样的事情。
答案 2 :(得分:0)
您似乎尝试从长到大的数据,因此reshape
和data.table
是您最好的选择。但在此之前,您需要创建一个索引变量:
data.new <- data %>%
group_by(id, locale) %>%
mutate(ReferralDate = paste0("ReferralDate", row_number()) %>%
spread(ReferralDate, referraldate)
我不确定你是否也希望保留locale
。因此,您可能希望将其分组,以防万一。