gpt4 book ai didi

r - 为缺少的时间步骤添加行的最快方法?

转载 作者:行者123 更新时间:2023-12-03 08:39:38 24 4
gpt4 key购买 nike

我的数据集中有一列,其中时间段( Time )是从 a 到 b 的整数。有时,任何给定的组都可能缺少时间段。我想用 NA 填充这些行.以下是 1 个(共 1000 个)组的示例数据。

structure(list(Id = c(1, 1, 1, 1), Time = c(1, 2, 4, 5), Value = c(0.568780482159894, 
-0.7207749516298, 1.24258192959273, 0.682123081696789)), .Names = c("Id",
"Time", "Value"), row.names = c(NA, 4L), class = "data.frame")


Id Time Value
1 1 1 0.5687805
2 1 2 -0.7207750
3 1 4 1.2425819
4 1 5 0.6821231

如您所见,缺少时间 3。通常可能会丢失一个或多个。我可以自己解决这个问题,但恐怕我不会以最有效的方式做到这一点。我的方法是创建一个函数:

min(Time) 生成一系列时间段至 max(Time)
然后做一个 setdiff抢失踪 Time值。

将该向量转换为 data.frame
提取唯一标识符变量( Id 和上面未列出的其他变量),并将其添加到此 data.frame。

将两者合并。

从函数返回。

所以整个过程将被执行如下:
   # Split the data into individual data.frames by Id.
temp_list <- dlply(original_data, .(Id))
# pad each data.frame
tlist2 <- llply(temp_list, my_pad_function)
# collapse the list back to a data.frame
filled_in_data <- ldply(tlist2)

更好的方法来实现这一目标?

最佳答案

跟进 Ben Barnes 的评论并从他的 mydf3 开始:

DT = as.data.table(mydf3)
setkey(DT,Id,Time)
DT[CJ(unique(Id),seq(min(Time),max(Time)))]
Id Time Value Id2
[1,] 1 1 -0.262482283 2
[2,] 1 2 -1.423935165 2
[3,] 1 3 0.500523295 1
[4,] 1 4 -1.912687398 1
[5,] 1 5 -1.459766444 2
[6,] 1 6 -0.691736451 1
[7,] 1 7 NA NA
[8,] 1 8 0.001041489 2
[9,] 1 9 0.495820559 2
[10,] 1 10 -0.673167744 1
First 10 rows of 12800 printed.

setkey(DT,Id,Id2,Time)
DT[CJ(unique(Id),unique(Id2),seq(min(Time),max(Time)))]
Id Id2 Time Value
[1,] 1 1 1 NA
[2,] 1 1 2 NA
[3,] 1 1 3 0.5005233
[4,] 1 1 4 -1.9126874
[5,] 1 1 5 NA
[6,] 1 1 6 -0.6917365
[7,] 1 1 7 NA
[8,] 1 1 8 NA
[9,] 1 1 9 NA
[10,] 1 1 10 -0.6731677
First 10 rows of 25600 printed.
CJ代表交叉连接,见 ?CJ .填充 NA s 发生是因为 nomatch默认为 NA .套装 nomatch0而不是删除没有匹配项。如果不是用 NA 填充s 主要行是必需的,只需添加 roll=TRUE .这比用 NA 填充更有效s 然后填充 NA s 之后。见 roll的说明在 ?data.table .
setkey(DT,Id,Time)
DT[CJ(unique(Id),seq(min(Time),max(Time))),roll=TRUE]
Id Time Value Id2
[1,] 1 1 -0.262482283 2
[2,] 1 2 -1.423935165 2
[3,] 1 3 0.500523295 1
[4,] 1 4 -1.912687398 1
[5,] 1 5 -1.459766444 2
[6,] 1 6 -0.691736451 1
[7,] 1 7 -0.691736451 1
[8,] 1 8 0.001041489 2
[9,] 1 9 0.495820559 2
[10,] 1 10 -0.673167744 1
First 10 rows of 12800 printed.

setkey(DT,Id,Id2,Time)
DT[CJ(unique(Id),unique(Id2),seq(min(Time),max(Time))),roll=TRUE]
Id Id2 Time Value
[1,] 1 1 1 NA
[2,] 1 1 2 NA
[3,] 1 1 3 0.5005233
[4,] 1 1 4 -1.9126874
[5,] 1 1 5 -1.9126874
[6,] 1 1 6 -0.6917365
[7,] 1 1 7 -0.6917365
[8,] 1 1 8 -0.6917365
[9,] 1 1 9 -0.6917365
[10,] 1 1 10 -0.6731677
First 10 rows of 25600 printed.

您可以使用 on 代替设置 key . CJ还需要一个 unique争论。一个带有两个“Id”的小例子:
d <- data.table(Id = rep(1:2, 4:3), Time = c(1, 2, 4, 5, 2, 3, 4), val = 1:7)

d[CJ(Id, Time = seq(min(Time), max(Time)), unique = TRUE), on = .(Id, Time)]
# Id Time val
# 1: 1 1 1
# 2: 1 2 2
# 3: 1 3 NA
# 4: 1 4 3
# 5: 1 5 4
# 6: 2 1 NA
# 7: 2 2 5
# 8: 2 3 6
# 9: 2 4 7
# 10: 2 5 NA

在这种特殊情况下, CJ 中的向量之一由 seq 生成,结果需要显式命名以匹配 on 中指定的名称.在 CJ 中使用裸变量时虽然(如此处的“Id”),它们是自动命名的,如 data.table() (来自 data.table 1.12.2)。

关于r - 为缺少的时间步骤添加行的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com