我有一个数据集,其结构如下:
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的解决方案。
我认为您不需要为这个问题进行花式连接:
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中,下一个来源与前一个目的地相同。
与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
您可以每次都
创建一个表,每次您都想知道每个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]
是一个滚动连接,行由表i
、on=
和roll=
选择 - 连接中的表达式
x. v
从x
中选择列v
关于最后一个项目符号,前缀< code>i.*
将对< code>i中的列做同样的事情。
问题内容: 我试图执行以下SQL查询并根据日期过滤出数据。 我需要显示一个表,该表过滤掉数据,使得仅那些提到的start_date和end_date之间的行 这是我一直在尝试的查询 我也从2012年获得了具有价值的结果。请帮帮我 谢谢 问题答案: 由于您没有提及任何错误(如果和是数据类型),因此查询没有任何问题。如果您没有获得正确的记录,请检查数据。 但是你的。您可以遵循一些好的做法来避免此类问题
本文向大家介绍如何从R中的数据框中查找星期几?,包括了如何从R中的数据框中查找星期几?的使用技巧和注意事项,需要的朋友参考一下 可以通过使用平日功能来完成。 示例
在此容器中只存在默认DB。 如何创建数据库?
问题内容: 在我的应用程序中,我想用JTable的行创建过渡效果。例如,当鼠标进入该行时,该行的背景颜色将改变;相反,当鼠标退出该行时,该行的颜色将恢复正常。 我怎样才能做到这一点? 问题答案: 使用下面的代码,这将为您提供关于对JTable的行应用翻转效果的想法。
我想通过使用或任何其他函数在R中创建以下序列。 基本上,。
因为xv中的值可能会改变,xv中的条目数也可能改变,所以我需要能够使用函数来做到这一点? 你知道我怎么做吗?