如何填充(自动填充)值,例如使用 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 替换为组中的第一个值?的主要内容,如果未能解决你的问题,请参考以下文章