说我有这两个数据框:
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)
一个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)