在R中,合并两个数据框,填写空白

时间:2013-02-12 23:33:52

标签: r merge

说我有这两个数据框:

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设置为表格中的值。

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

可能没有&#39;过程&#39; (上例中的颜色)表示big.table顶部的行。这些行应该保持NA。

第一个&#39;过程&#39;启动时,该流程起始行与下一行之间的每一行都属于第一个流程。当第二个过程开始时,该过程起始行和下一个过程起始行之间的每一行都属于第二个过程。等等。处理行永远不会与我收集到日志文件数据框中的其他行相同。

我的计划是将big.table创建为所有日志行号的序列,并将小表合并到它。然后我可以&#34;填写&#34;进程名称并将大表合并到日志文件中,仅保留日志文件以及连接到它的所有内容。

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

2 个答案:

答案 0 :(得分:13)

听起来你需要{strong>动物园包中的na.locf(代表最后一次观察结果):

library(zoo)
tbl <- merge(small.table, big.table, by = "idx", all.y=TRUE)
tbl$color2 <- na.locf(tbl$color,na.rm = FALSE)

答案 1 :(得分: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
#  . . . .