提取特定于日期的变量变化并按 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(示例中的 aabb),参数 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