如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?

Posted

技术标签:

【中文标题】如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?【英文标题】:How to FILL DOWN (autofill) value , eg replace NA with first value in group, using data.table in R? 【发布时间】:2019-04-30 13:40:35 【问题描述】:

非常简单和常见的任务: 我需要填写data.table(类似于MS Excel中的自动填充功能),以便

library(data.table)
DT <- fread(
"Paul 32
NA    45
NA    56
John  1
NA    5
George 88
NA    112")

变成

Paul 32
Paul 45
Paul 56
John 1
John 5
George 88
George 112

谢谢!

【问题讨论】:

看看this是否有帮助。 绝妙的想法 - 将数据视为时间序列!然后确实有多种方法可以在 ts 中估算 NA! 原来这个问题有两个例子要解决。第二个后来被删除 - 只是这个问题。如下所示。下面给出了答案。例 2: DT 【参考方案1】:

是的,最好的方法是使用@Rui Barradas 的zoo 包的想法。您可以使用na.locf 函数在一行代码中轻松完成。

library(zoo)
DT[, V1:=na.locf(V1)]

在使用 fread 读取数据后,将 V1 替换为您为列命名的任何内容。祝你好运!

【讨论】:

这巧妙地解决了示例 1。一旦我为示例 2 编写了代码,我将在此处发布。谢谢! 相关解决方案:将NA替换为0:***.com/questions/7235657/…:` for (i in names(DT)) DT[is.na(get(i)), (i):=0 ]` 这里发布了另一种方式:***.com/questions/26171958/… - DT[, filled4 := DT[!is.na(value)][DT, value, roll = T]]。但我无法让它在我的示例中运行;(【参考方案2】:

例如2,可以考虑使用stats::spline进行外推,如下:

DT2[is.na(V2), V2 := 
    as.integer(DT2[, spline(.I[!is.na(V2)], V2[!is.na(V2)], xout=.I[is.na(V2)]), by=.(V1)]$y)]

输出:

     V1  V2
1: Paul   1
2: Paul   2
3: Paul   3
4: Paul   4
5: John 100
6: John 110
7: John 120
8: John 130

数据:

DT2 <- fread(
"Paul, 1
Paul, 2 
Paul, NA 
Paul, NA 
John, 100
John, 110
John, NA
John, NA")

【讨论】:

这是更通用的自动填充解决方案的答案,最初在本问题的示例 2 中提出,后来从问题中删除,即 DT

以上是关于如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?的主要内容,如果未能解决你的问题,请参考以下文章

创建新行时的剑道网格,使用现有行中的值自动填充字段

如何根据多个单元格中的值自动填充

使用In-cell下拉列表中的值自动填充单元格 - VBA

如何根据列中的值自动填充谷歌表格中的数据

根据下拉值自动填充文本框

如何使用 R 使用地理邻近度填充缺失的分类值?