【问题标题】:R date time aligning and fill through valuesR日期时间对齐和填充值
【发布时间】:2013-01-16 16:59:46
【问题描述】:

我有多个框架,为此假设 2。 每帧包含 2 列 - 一个索引列和一个值列

sz<-5;
frame_1<-data.frame(index=sort(sample(1:10,sz,replace=F)),value=rpois(sz,50));
frame_2<-data.frame(index=sort(sample(1:10,sz,replace=F)),value=rpois(sz,50));

frame_1:

 index value
  1    49
  6    62
  7    58
  8    30
 10    50

frame_2:

index value
  4    60
  5    64
  6    48
  7    46
  9    57

目标是创建第三个框架,frame_3,其索引将是 frame_1 和 frame_2 中的并集,

frame_3<-data.frame(index = sort(union(frame_1$index,frame_2$index)));

其中将包含两个额外的列,value_1 和 value_2。

frame_3$value_1从frame_1$value填写,frame_3$value_2从frame_2$value填写;

这些应该像这样填写: frame_3:

index value_1 value_2
1      49       NA
4      49       60     # value_1 is filled through with previous value
5      49       64     # value_1 is filled through with previous value
6      62       48     
7      58       46   
8      30       46     # value_2 is filled through with previous value
9      30       57     # value_1 is filled through with previous value
10     50       57     # value_1 is filled through with previous value

我正在寻找一种有效的解决方案,因为我正在处理成千上万的记录

【问题讨论】:

  • (+1) 构图精美。一个小建议。使用set.seed(.) 以便粘贴代码产生相同的输出。在这种情况下,我使用了你的桌子。
  • @Arun 是的,下次;谢谢

标签: r dataframe vectorization


【解决方案1】:

这个问题为data.table 尖叫。您可以使用循环使用x[y, roll=TRUE] 逐一递归地构造列。

require(data.table)
dt1 <- data.table(frame_1)
dt2 <- data.table(frame_2)
setkey(dt1, index)
setkey(dt2, index)
dt3 <- data.table(index = sort(unique(c(dt1$index, dt2$index))))
> dt1[dt2[dt3, roll=TRUE], roll=TRUE]

#    index value value.1
# 1:     1    49      NA
# 2:     4    49      60
# 3:     5    49      64
# 4:     6    62      48
# 5:     7    58      46
# 6:     8    30      46
# 7:     9    30      57
# 8:    10    50      57

【讨论】:

  • +1 你确定是data.table 的问题吗? :)
【解决方案2】:

如果您的 data.frames 不是很大,您可以使用 merge 结合 zoo::na.locf

R> library(zoo)
R> frame_3 <- merge(frame_1, frame_2, by="index",
+                  all=TRUE, suffixes=paste(".",1:2,sep=""))
R > (frame_3 <- na.locf(frame_3))
  index value.1 value.2
1     1      49      NA
2     4      49      60
3     5      49      64
4     6      62      48
5     7      58      46
6     8      30      46
7     9      30      57
8    10      50      57

或者,假设您的“值”列都是一种类型(如矩阵,您不能在 zoo 对象中混合类型)。

R> z1 <- zoo(frame_1$value, frame_1$index)
R> z2 <- zoo(frame_2$value, frame_2$index)
R> (z3 <- na.locf(merge(z1, z2)))
   z1 z2
1  49 NA
4  49 60
5  49 64
6  62 48
7  58 46
8  30 46
9  30 57
10 50 57

【讨论】:

  • 这也可以,但我很好奇,如果数据框不是太大,为什么你会用它来限定你的答案
  • @AdityaSihag:因为 data.table 对象比 data.frames 更快、更高效。顺便说一句,“大”是超过 100 万行和 20 多列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2020-11-07
相关资源
最近更新 更多