提取日期特定变量更改并按ID

时间:2017-01-13 18:51:47

标签: r dataframe timeline

我正在尝试提取因子值更改的日期(通过唯一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轴上。我设想的是水平条形图,其颜色根据值字段而变化。这样,您可以可视化每个人在不同时间内处于相同值的时间。

真的很感激任何帮助!

1 个答案:

答案 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(示例中为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