8

假设我有这两个数据框:

big.table <- data.frame("idx" = 1:100)

small.table <- data.frame("idx" = sample(1:100, 10), "color" = sample(colors(),10))

我想像这样将它们合并在一起:

merge(small.table, big.table, by = "idx", all.y=TRUE)

idx           color
1     1            <NA>
2     2            <NA>
3     3         salmon2
4     4            <NA>
5     5            <NA>
6     6            <NA>
...
20   20            <NA>
21   21            <NA>
22   22           blue4
23   23          grey99
24   24            <NA>
25   25            <NA>
26   26            <NA>
...

现在我需要填写表格下方“颜色”列中的值,以便将所有 NA 设置为表格中之前的值。

注意:问题涉及从计算机程序生成的日志文件,而不是任何标准日志格式。此日志文件中的行块属于在块的第一行中标识的“进程”。我已经在日志文件的相关行中提取了信息,其中大部分属于一个进程,并创建了一个包含该信息(行号、时间戳等)的数据表。现在我需要在此表中填写与 small.table 中的每一行对应的“进程”名称,该表具有行号。

big.table 顶部的行可能没有“进程”(上例中的颜色)。这些行应保持为 NA。

一旦第一个“进程”开始,该进程开始行和下一个进程之间的每一行都属于第一个进程。当第二个进程启动时,该进程启动行和下一个进程启动行之间的每一行都属于第二个进程。等等。进程行与我收集到日志文件数据框中的其他行的行号永远不会相同。

我的计划是将 big.table 创建为所有日志行号的序列,并将小表合并到其中。然后我可以“填写”进程名称并将大表合并到日志文件中,只保留日志文件以及与之相连的所有内容。

我对其他方法持开放态度。

4

2 回答 2

13

听起来你需要na.locf从包zoo中(代表最后的观察结转):

library(zoo)
tbl <- merge(small.table, big.table, by = "idx", all.y=TRUE)
tbl$color2 <- na.locf(tbl$color,na.rm = FALSE)
于 2013-02-12T23:39:17.437 回答
8

一个data.table解决方案:

require(data.table)
b <- data.table(big.table, key="idx")
s <- data.table(small.table, key="idx")
s[b, roll=T]

#      idx          color
#   1:   1             NA
#   2:   2             NA
#   3:   3             NA
#   4:   4          blue3
#   5:   5          blue3
#   6:   6          blue3
#   7:   7          blue3
#   8:   8          blue3
#   9:   9          blue3
#  10:  10          blue3
#  11:  11   navajowhite1
#  12:  12   navajowhite1
#  . . . .
于 2013-02-12T23:50:09.683 回答