gpt4 book ai didi

r - 按 id 为两个特定变量合并日期并创建新变量

转载 作者:行者123 更新时间:2023-12-05 03:10:54 25 4
gpt4 key购买 nike

您好,我正在努力从当前数据框创建数据框。事件列有两种类型的事件和两种类型的日期。这是我的数据。

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”的列,其中将存储 missed/kept/EB/IK 类别。第三,需要一个“event.number”列,其中将为每个 id 提供事件顺序编号。最后,我需要一个名为“missed/kept counter”的列来计算每个 id 的 keep/missed 数量。

数据应如下所示。

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

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

提前感谢您的帮助。

最好的。

最佳答案

尝试使用 data.table。从您的数据开始按行组合而不是按列组合,这使您的数据已经接近您想要的:

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

然后分别按iddate 排序:

setorder( data1, id, date )

获取event.number。感谢看到@bgoldst 的解决方案:)

data1[ , event.number := seq_len( .N ), by = id ]

你的最后一步,似乎是每个 id 中“missed”和“keep”的累积计数:

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

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

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

关于r - 按 id 为两个特定变量合并日期并创建新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com