我正在尝试提取因子值更改的日期(通过唯一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))))
其中我有一系列日期,在某些时候,因子变量(在这种情况下&#34;值)会发生变化。我需要提取每个人的开始和结束日期,以便我可以在时间轴上绘制这些日期。
在这种情况下,我最终会得到一个看起来像的产品:
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轴上。我设想的是水平条形图,其颜色根据值字段而变化。这样,您可以可视化每个人在不同时间内处于相同值的时间。
真的很感激任何帮助!
答案 0 :(得分:0)
按ID拆分数据。如果你有很多id,你可能需要一个循环。您需要更改&#34;值&#34;每个id分割我的解决方案所需的数据。然后编写一个函数来比较每个&#34;值&#34;用以下观察。 ifelse
语句可以说:if
第一次观察&#34;值&#34; ==第二次观察then
删除该观察,else
跳到下一次观察并重复。确保使用数据。重新创建可重现的示例时,表而不是数据框。我这样做了:
# 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
现在是一个删除行中没有变化的行的函数&#34; value&#34;发生:
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