当前位置: 首页 > 知识库问答 >
问题:

如何在R中从过渡日期数据中创建面板数据集?

梁丘霖
2023-03-14

我有一个数据集,其结构如下:

ID   origin   destination  time
1     a        b           2
2     b        a           1
2     a        c           4
3     c        b           1
3     b        c           3

我想把它变成一个ID-time面板数据集,比如:

ID   location  time
1     a        1
1     b        2
1     b        3
1     b        4
2     a        1
2     a        2
2     a        3
2     c        4
3     b        1
3     b        2
3     c        3
3     c        4

所以基本上,我需要在主题没有改变位置时创建面板行,并根据原点和目的地的信息填写它们应该在的位置。R中是否有任何函数可以顺利完成此操作?我更喜欢使用data.table或dplyr的解决方案。

共有3个答案

云英才
2023-03-14

我认为您不需要为这个问题进行花式连接:

maxt = max(dt$time)
dt[, .(location = c(rep(origin[1], time[1] - 1), rep(destination, diff(c(time, maxt + 1)))),
       time = 1:maxt), by = ID]
#    ID location time
# 1:  1        a    1
# 2:  1        b    2
# 3:  1        b    3
# 4:  1        b    4
# 5:  2        a    1
# 6:  2        a    2
# 7:  2        a    3
# 8:  2        c    4
# 9:  3        b    1
#10:  3        b    2
#11:  3        c    3
#12:  3        c    4

根据OP示例,我假设在单个ID中,下一个来源与前一个目的地相同。

钱德海
2023-03-14

与Frank的解决方案类似的方法,但使用两个连接是:

library(data.table)
res <- setDT(expand.grid(ID = unique(dt$ID), time = 1:4))

#Get origin
res[dt[,.(ID, origin, time = time - 1L)], location := origin, on = .(ID = ID, time = time)]

#Update origin and destination
res[dt, location := destination, on = c("ID", "time")][, location := zoo::na.locf(location), by = ID][order(ID, time)]

 #   ID time location
 #1:  1    1        a
 #2:  1    2        b
 #3:  1    3        b
 #4:  1    4        b
 #5:  2    1        a
 #6:  2    2        a
 #7:  2    3        a
 #8:  2    4        c
 #9:  3    1        b
#10:  3    2        b
#11:  3    3        c
#12:  3    4        c
佴普松
2023-03-14

您可以每次都创建一个表,每次您都想知道每个ID的位置

newDT = DT[, CJ(ID = unique(ID), time = 1:4)]

然后将原始数据放入长格式,推断

  • 起始点适用于时间-1
  • 目的地保留时间
mDT = melt(DT, id = c("ID", "time"), value.name = "loc", variable.name = "loc_role")
mDT[loc_role == "origin", time := time - 1L]
mDT[, loc_role := NULL]
setorder(mDT, ID, time)

    ID time loc
 1:  1    1   a
 2:  1    2   b
 3:  2    0   b
 4:  2    1   a
 5:  2    3   a
 6:  2    4   c
 7:  3    0   c
 8:  3    1   b
 9:  3    2   b
10:  3    3   c

…并使用滚动更新联接填充新表:

newDT[, location := mDT[.SD, on=.(ID, time), roll=TRUE, x.loc]]

    ID time location
 1:  1    1        a
 2:  1    2        b
 3:  1    3        b
 4:  1    4        b
 5:  2    1        a
 6:  2    2        a
 7:  2    3        a
 8:  2    4        c
 9:  3    1        b
10:  3    2        b
11:  3    3        c
12:  3    4        c

(Dplyr还没有滚动连接或更新连接,所以我想没有类似的功能。)

它是如何工作的

  • CJ取一些向量的笛卡尔积,类似于expand.grid
  • 融化转换为长形式,保持变量传递为id=
  • x[i, v:=exr]i
  • 选择的行上编辑表x的列v
  • setorder排序到位
  • x[i, j]j中的SD是指i
  • 选择的数据子集(x
  • x[i, on=, roll=, exr]是一个滚动连接,行由表ion=roll=
  • 选择
  • 连接中的表达式x. vx
  • 中选择列v

关于最后一个项目符号,前缀< code>i.*将对< code>i中的列做同样的事情。

 类似资料:
  • 问题内容: 我试图执行以下SQL查询并根据日期过滤出数据。 我需要显示一个表,该表过滤掉数据,使得仅那些提到的start_date和end_date之间的行 这是我一直在尝试的查询 我也从2012年获得了具有价值的结果。请帮帮我 谢谢 问题答案: 由于您没有提及任何错误(如果和是数据类型),因此查询没有任何问题。如果您没有获得正确的记录,请检查数据。 但是你的。您可以遵循一些好的做法来避免此类问题

  • 本文向大家介绍如何从R中的数据框中查找星期几?,包括了如何从R中的数据框中查找星期几?的使用技巧和注意事项,需要的朋友参考一下 可以通过使用平日功能来完成。 示例

  • 在此容器中只存在默认DB。 如何创建数据库?

  • 问题内容: 在我的应用程序中,我想用JTable的行创建过渡效果。例如,当鼠标进入该行时,该行的背景颜色将改变;相反,当鼠标退出该行时,该行的颜色将恢复正常。 我怎样才能做到这一点? 问题答案: 使用下面的代码,这将为您提供关于对JTable的行应用翻转效果的想法。

  • 我想通过使用或任何其他函数在R中创建以下序列。 基本上,。

  • 因为xv中的值可能会改变,xv中的条目数也可能改变,所以我需要能够使用函数来做到这一点? 你知道我怎么做吗?