按id合并两个特定变量的日期并创建新变量。

3

你好,我在尝试从当前数据框中创建一个数据框,但遇到了困难。事件列有两种类型,日期也有两种类型。 以下是我的数据。

id <- c(1,1,2,2,3,3)
type1 <- c("EB","EB","EB","IK","IK","EB")
date1 <- c("2011/08/31", "2011/08/31", "2012/01/15", "2012/01/20", "2012/03/10", "2012/03/24")
type2 <- c("missed", "missed", "kept", "missed", "kept", "missed")
date2 <- c("2011/03/17", "2011/03/18", "2011/03/30", "2012/04/25", "2012/05/01", "2012/05/10")

data1 <- data.frame(id, type1, date1, type2, date2)

 id type1      date1   type2      date2
 1    EB  2011/08/31  missed  2011/03/17
 1    EB  2011/08/31  missed  2011/03/18
 2    EB  2012/01/15   kept   2011/03/30
 2    IK  2012/01/20  missed  2012/04/25
 3    IK  2012/03/10   kept   2012/05/01
 3    EB  2012/03/24  missed  2012/05/10

首先,我想将这两个日期列合并为每个id一个有序日期列。其次,我需要一个名为“event.type”的列,其中存储缺失/保留/EB/IK类别。第三,我需要一个名为“event.number”的列,其中为每个id赋予一个事件顺序号。最后,我需要一个名为“missed/kept counter”的列,用于计算每个id的缺失/保留数量。
数据应如下所示:
id <- c(1,1,1,2,2,2,2,3,3,3,3)
date <- c("2011/03/17", "2011/03/18", "2011/08/31", "2011/03/30", "2012/01/15", "2012/01/20","2012/04/25","2012/03/10","2012/03/24","2012/05/01","2012/05/10")
event.type <- c("missed", "missed", "EB", "kept", "EB", "IK", "missed", "IK", "EB", "kept", "missed")
event.number <- c(1,2,3,1,2,3,4,1,2,3,4) 
missed.kept.counter <- c(1,2,0,1,0,0,1,0,0,1,2)

data2 <- data.frame(id,date,event.type,event.number,missed.kept.counter)

> data2
id       date   event.type    event.number      missed.kept.counter
1   2011/03/17     missed            1                   1
1   2011/03/18     missed            2                   2
1   2011/08/31         EB            3                   0
2   2011/03/30       kept            1                   1
2   2012/01/15         EB            2                   0
2   2012/01/20         IK            3                   0
2   2012/04/25     missed            4                   1
3   2012/03/10         IK            1                   0
3   2012/03/24         EB            2                   0
3   2012/05/01       kept            3                   1
3   2012/05/10     missed            4                   2

我期待任何帮助让我摆脱这个问题。

提前感谢你的帮助。

祝一切顺利。


1
在您的原始数据中,type1 是否对应于 date1type2 是否对应于 date2?这意味着它们可以是两个独立的数据框,然后根据 id 进行合并吗? - Gaurav Bansal
是的,没错。我看到你下面的解决方案了。它非常有效。感谢你的回复和解决方案。最后一列将为每种事件类型提供某种勾号标记。我可以将它们用作频率。 - amisos55
3个回答

2

尝试使用data.table。从行的角度开始组合数据,而不是列的角度,这样可以使得数据更接近您想要的结果:

library( data.table )
data1 <- data.table( id = rep( id, 2 ), 
                     type = c( type1, type2 ), 
                     date = c( date1, date2 ) )

然后按照id和date进行排序:
setorder( data1, id, date )

为了获取 event.number。我已经进行了编辑,感谢看到 @bgoldst 的解决方案,使其更整洁。
data1[ , event.number := seq_len( .N ), by = id ]

您的最后一步似乎是将每个id中的“错过”和“保留”累计计数:

data1[ type == "missed" | type == "kept"
, missed.kept.number := cumsum( type == "missed" | type == "kept" ), by = id ]

这将为您提供所需的数字,在missed.kept.number列中的其他位置为NAs。如果您特别想要零,则在上面的“最后一步”之前添加此行:

data1[ , missed.kept.number := 0L ] 

最后一步是关于错过/保留、EB和IP的打勾标记。我还没有为EB和IP添加列。这些列将给我一些关于错过/保留之前和之后发生了什么的想法。感谢您的解决方案。我非常感激像您这样的帮手。 - amisos55
好的,我认为我在这里的编辑满足了你想要的。你已经得到了一些答案,它们给出了相同的结果,这很棒。解决问题有不止一种方法! - rosscova

1
这里有一种方法可以完成前三个任务。我不确定你在最后一个任务中想要什么。
#Create data
id <- c(1,1,2,2,3,3)
type1 <- c("EB","EB","EB","IK","IK","EB")
date1 <- c("2011/08/31", "2011/08/31", "2012/01/15", "2012/01/20", "2012/03/10", "2012/03/24")
type2 <- c("missed", "missed", "kept", "missed", "kept", "missed")
date2 <- c("2011/03/17", "2011/03/18", "2011/03/30", "2012/04/25", "2012/05/01", "2012/05/10")

#Create data frames
data1 <- data.frame(id, date=date1, event.type=type1)
data2 <- data.frame(id, date=date2, event.type=type2)

#Merge and order data
df <- merge(data1, data2, all=T)
df <- df[!duplicated(df),]
df <- df[order(df$id, df$date),]

#Create event.number column
library(dplyr)
df$event.number <- (df %>% group_by(id) %>% mutate(counter = row_number(id)))$counter

1
library(data.table);

## coerce frame to data.table and convert factors to character vectors
setDT(data1);
data1[j=names(data1)[-1L]:=lapply(.SD[,-1L,with=F],as.character)];

## transform data1 into data2, governed by ordered unique dates
data2 <- data1[by=id,j={
    d <- c(date1,date2);
    u <- which(!duplicated(d));
    u <- u[order(d[u])];
    .(date=d[u],event.type=c(type1,type2)[u]);
}];

## derive additional columns
data2[by=id,j=event.number:=seq_len(.N)];
data2[by=id,j=missed.kept.counter:={
    cntl <- event.type%in%c('missed','kept');
    ifelse(cntl,cumsum(cntl),0L);
}];

## result
data2;
##     id       date event.type event.number missed.kept.counter
##  1:  1 2011/03/17     missed            1                   1
##  2:  1 2011/03/18     missed            2                   2
##  3:  1 2011/08/31         EB            3                   0
##  4:  2 2011/03/30       kept            1                   1
##  5:  2 2012/01/15         EB            2                   0
##  6:  2 2012/01/20         IK            3                   0
##  7:  2 2012/04/25     missed            4                   2
##  8:  3 2012/03/10         IK            1                   0
##  9:  3 2012/03/24         EB            2                   0
## 10:  3 2012/05/01       kept            3                   1
## 11:  3 2012/05/10     missed            4                   2

1
非常感谢您的解决方案。那给了一个直接的答案。您节省了我很多时间。我也希望您在需要帮助时能够得到非常快速的帮助。非常感谢! - amisos55

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