【发布时间】:2015-02-06 17:52:15
【问题描述】:
编辑
该问题最初是针对data.table 提出的。任何包的解决方案都会很有趣。
我有点卡在一个更普遍的问题的特定变体上。我有与 data.table 一起使用的面板数据,我想使用 data.table 的 group by 功能填充一些缺失值。不幸的是它们不是数字,所以我不能简单地插值,但它们只能根据条件填写。是否可以在 data.tables 中执行一种有条件的 na.locf?
基本上我只想填写 NAs 如果在 NAs 之后的下一个观察是之前的观察,但更普遍的问题是如何有条件地填写 NAs。
例如,在下面的数据中,我想按每个 id 组来填写 associatedid 变量。所以 id==1 , year==2003 将填写为 ABC123 因为它是 NA 之前和之后的值,但不是 2000 相同的 id。 id== 2 不会更改,因为下一个值与 NA 之前的值不同。 id==3 将填写 2003 年和 2004 年。
mydf <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), year = c(2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L), associatedid = structure(c(NA, 1L, 1L, NA, 1L, 1L, NA, 1L, 1L, NA, 2L, 2L, NA, 1L, 1L, NA, NA, 1L), .Label = c("ABC123", "DEF456"), class = "factor")), class = "data.frame", row.names = c(NA, -18L))
mydf
#> id year associatedid
#> 1 1 2000 <NA>
#> 2 1 2001 ABC123
#> 3 1 2002 ABC123
#> 4 1 2003 <NA>
#> 5 1 2004 ABC123
#> 6 1 2005 ABC123
#> 7 2 2000 <NA>
#> 8 2 2001 ABC123
#> 9 2 2002 ABC123
#> 10 2 2003 <NA>
#> 11 2 2004 DEF456
#> 12 2 2005 DEF456
#> 13 3 2000 <NA>
#> 14 3 2001 ABC123
#> 15 3 2002 ABC123
#> 16 3 2003 <NA>
#> 17 3 2004 <NA>
#> 18 3 2005 ABC123
dt = data.table(mydf, key = c("id"))
想要的输出
#> id year associatedid
#> 1 1 2000 <NA>
#> 2 1 2001 ABC123
#> 3 1 2002 ABC123
#> 4 1 2003 ABC123
#> 5 1 2004 ABC123
#> 6 1 2005 ABC123
#> 7 2 2000 <NA>
#> 8 2 2001 ABC123
#> 9 2 2002 ABC123
#> 10 2 2003 <NA>
#> 11 2 2004 DEF456
#> 12 2 2005 DEF456
#> 13 3 2000 <NA>
#> 14 3 2001 ABC123
#> 15 3 2002 ABC123
#> 16 3 2003 ABC123
#> 17 3 2004 ABC123
#> 18 3 2005 ABC123
【问题讨论】:
-
另一种选择:Replace NA values if last and next non-NA value are the same。该逻辑应该很容易适应
data.table及其setnafill。 -
@Henrik 感谢您指出这个问题。我一直在寻找类似的东西,但没有找到。这当然是一种可能的方式!
-
@RonakShah 对我的类似问题的回答也可能有助于将此问题推广到有条件的 NA 填充 stackoverflow.com/a/59357336/7941188
标签: r dplyr data.table plyr na