提取特定于日期的变量变化并按 ID 在时间轴上绘制
Extracting Date specific variable changes and plotting on timeline by ID
我正在尝试提取因子值发生变化的日期(通过唯一 ID),以便我可以绘制时间轴。
此时,我很难从原始数据框中提取数据,甚至无法开始制作时间线。
示例数据集如下所示:
df <- data.frame(id = c(rep(1201, 10), rep(1202, 14)),
date = c(seq(1,10,1), seq(2,15,1)),
value = as.factor(c(rep(1, 5,), rep(2, 3), rep(3, 6), rep (1, 3), rep (2, 2), rep(3, 5))))
其中我有一系列日期,在某些时候,因子变量(在本例中为“值”)会发生变化。我需要提取每个人的开始和结束日期,以便我可以将它们绘制成时间轴。
在这种情况下,我最终会得到如下所示的产品:
out <- data.frame (id = c(rep(1201, 3), rep(1202, 4)),
date = c(1, 6, 9, 2, 6, 9, 11),
value = c(1, 2, 3, 3, 1, 2, 3))
从那里开始,我想绘制某种形式的时间线,其中每个 ID 位于 y 轴上,日期位于 x 轴上。我设想的是一个水平条形图,其中颜色根据值字段而变化。这样,您可以想象每个人在不同时间处于相同值的时间。
非常感谢任何帮助!
按id拆分数据。如果你有很多 id,你可能需要一个循环。您需要更改每个 ID 的 "value" 这一事实使得拆分我的解决方案所需的数据。然后编写一个函数,将每个 "value" 观察值与以下值进行比较。 ifelse
语句可以说:if
"value" 的第一个观察结果 == 第二个观察结果 then
删除那个观察结果,else
跳到下一个观察结果并重复。确保使用数据。 table 重新创建可重现示例时,而不是数据框。我这样做了:
# install.packages(data.table) # only if you do not have data table
library(data.table)
df <- data.table(id = c(rep(1201, 10), rep(1202, 14)), # data.table not frame
date = c(seq(1,10,1), seq(2,15,1)),
value = as.factor(c(rep(1, 5,), rep(2, 3), rep(3, 6), rep (1, 3), rep (2, 2), rep(3, 5))))
z <- df[, unique(id)]
aa <- df[id==z[1]] ; bb <- df[id==z[2]]
这给出了两个基于 id 的组
aa
# id date value
# 1: 1201 1 1
# 2: 1201 2 1
# 3: 1201 3 1
# 4: 1201 4 1
# 5: 1201 5 1
# 6: 1201 6 2
# 7: 1201 7 2
# 8: 1201 8 2
# 9: 1201 9 3
# 10: 1201 10 3
bb
# id date value
# 1: 1202 2 3
# 2: 1202 3 3
# 3: 1202 4 3
# 4: 1202 5 3
# 5: 1202 6 1
# 6: 1202 7 1
# 7: 1202 8 1
# 8: 1202 9 2
# 9: 1202 10 2
# 10: 1202 11 3
# 11: 1202 12 3
# 12: 1202 13 3
# 13: 1202 14 3
# 14: 1202 15 3
现在有一个函数可以删除 "value" 中没有发生变化的行:
value_change <- function(x,a) {
for(i in 1:length(x[,value])) {
ifelse(x[a,value] == x[a+1,value], x <- x[-(a+1)], a <- a+1)}
return(x)
}
在此函数中,参数 x
是 data.table(示例中的 aa
或 bb
),参数 a
是开始的行号循环(应该总是一个)。
value_change(aa, 1)
# id date value
# 1: 1201 1 1
# 2: 1201 6 2
# 3: 1201 9 3
value_change(bb, 1)
# id date value
# 1: 1202 2 3
# 2: 1202 6 1
# 3: 1202 9 2
# 4: 1202 11 3
aa <- value_change(aa, 1)
bb <- value_change(bb, 1)
dt_new <- rbind(aa,bb)
dt_new
# id date value
# 1: 1201 1 1
# 2: 1201 6 2
# 3: 1201 9 3
# 4: 1202 2 3
# 5: 1202 6 1
# 6: 1202 9 2
# 7: 1202 11 3
我正在尝试提取因子值发生变化的日期(通过唯一 ID),以便我可以绘制时间轴。
此时,我很难从原始数据框中提取数据,甚至无法开始制作时间线。
示例数据集如下所示:
df <- data.frame(id = c(rep(1201, 10), rep(1202, 14)),
date = c(seq(1,10,1), seq(2,15,1)),
value = as.factor(c(rep(1, 5,), rep(2, 3), rep(3, 6), rep (1, 3), rep (2, 2), rep(3, 5))))
其中我有一系列日期,在某些时候,因子变量(在本例中为“值”)会发生变化。我需要提取每个人的开始和结束日期,以便我可以将它们绘制成时间轴。
在这种情况下,我最终会得到如下所示的产品:
out <- data.frame (id = c(rep(1201, 3), rep(1202, 4)),
date = c(1, 6, 9, 2, 6, 9, 11),
value = c(1, 2, 3, 3, 1, 2, 3))
从那里开始,我想绘制某种形式的时间线,其中每个 ID 位于 y 轴上,日期位于 x 轴上。我设想的是一个水平条形图,其中颜色根据值字段而变化。这样,您可以想象每个人在不同时间处于相同值的时间。
非常感谢任何帮助!
按id拆分数据。如果你有很多 id,你可能需要一个循环。您需要更改每个 ID 的 "value" 这一事实使得拆分我的解决方案所需的数据。然后编写一个函数,将每个 "value" 观察值与以下值进行比较。 ifelse
语句可以说:if
"value" 的第一个观察结果 == 第二个观察结果 then
删除那个观察结果,else
跳到下一个观察结果并重复。确保使用数据。 table 重新创建可重现示例时,而不是数据框。我这样做了:
# install.packages(data.table) # only if you do not have data table
library(data.table)
df <- data.table(id = c(rep(1201, 10), rep(1202, 14)), # data.table not frame
date = c(seq(1,10,1), seq(2,15,1)),
value = as.factor(c(rep(1, 5,), rep(2, 3), rep(3, 6), rep (1, 3), rep (2, 2), rep(3, 5))))
z <- df[, unique(id)]
aa <- df[id==z[1]] ; bb <- df[id==z[2]]
这给出了两个基于 id 的组
aa
# id date value
# 1: 1201 1 1
# 2: 1201 2 1
# 3: 1201 3 1
# 4: 1201 4 1
# 5: 1201 5 1
# 6: 1201 6 2
# 7: 1201 7 2
# 8: 1201 8 2
# 9: 1201 9 3
# 10: 1201 10 3
bb
# id date value
# 1: 1202 2 3
# 2: 1202 3 3
# 3: 1202 4 3
# 4: 1202 5 3
# 5: 1202 6 1
# 6: 1202 7 1
# 7: 1202 8 1
# 8: 1202 9 2
# 9: 1202 10 2
# 10: 1202 11 3
# 11: 1202 12 3
# 12: 1202 13 3
# 13: 1202 14 3
# 14: 1202 15 3
现在有一个函数可以删除 "value" 中没有发生变化的行:
value_change <- function(x,a) {
for(i in 1:length(x[,value])) {
ifelse(x[a,value] == x[a+1,value], x <- x[-(a+1)], a <- a+1)}
return(x)
}
在此函数中,参数 x
是 data.table(示例中的 aa
或 bb
),参数 a
是开始的行号循环(应该总是一个)。
value_change(aa, 1)
# id date value
# 1: 1201 1 1
# 2: 1201 6 2
# 3: 1201 9 3
value_change(bb, 1)
# id date value
# 1: 1202 2 3
# 2: 1202 6 1
# 3: 1202 9 2
# 4: 1202 11 3
aa <- value_change(aa, 1)
bb <- value_change(bb, 1)
dt_new <- rbind(aa,bb)
dt_new
# id date value
# 1: 1201 1 1
# 2: 1201 6 2
# 3: 1201 9 3
# 4: 1202 2 3
# 5: 1202 6 1
# 6: 1202 9 2
# 7: 1202 11 3