说我有这两个数据框:
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;进程名称并将大表合并到日志文件中,仅保留日志文件以及连接到它的所有内容。
我对其他方法持开放态度。
答案 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
# . . . .