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

bra*_*dco 8 merge r

说我有这两个数据框:

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

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

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

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>
...
Run Code Online (Sandbox Code Playgroud)

现在我需要填充表格中"颜色"列中的值,以便将所有NA设置为表格中之前的值.

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

对于big.table顶部的行,可能没有"进程"(上例中的颜色).那些线应该保持NA.

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

我的计划是将big.table创建为所有日志行号的序列,并将小表合并到它.然后我可以"填写"进程名称并将大表合并到日志文件中,只保留日志文件中包含的所有内容.

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

jor*_*ran 13

听起来你需要na.locf从包裹动物园(代表最后的观察结果):

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


Aru*_*run 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
#  . . . .
Run Code Online (Sandbox Code Playgroud)