使用NAs(使用R base或data.table)向下填充列的行

使用NAs(使用R base或data.table)向下填充列的行,r,data.table,census,R,Data.table,Census,我想用人口普查的数据,但我一直想把它做成一个好的表格。数据分为四列:第一个县、第一个代码、第二个县、第二个代码。第一个county列不会重复,而是按照我现在读取的方式获取值“”: c1 cd1 c2 cd2 1 Alamance County, NC 37001 Alamance County, NC 37001 2 NA Caswell Cou

我想用人口普查的数据,但我一直想把它做成一个好的表格。数据分为四列:第一个县、第一个代码、第二个县、第二个代码。第一个county列不会重复,而是按照我现在读取的方式获取值“”:

                     c1   cd1                    c2   cd2
1   Alamance County, NC 37001   Alamance County, NC 37001
2                          NA    Caswell County, NC 37033
3                          NA    Chatham County, NC 37037
4                          NA   Guilford County, NC 37081
5                          NA     Orange County, NC 37135
6                          NA   Randolph County, NC 37151
7                          NA Rockingham County, NC 37157
8  Alexander County, NC 37003  Alexander County, NC 37003
9                          NA   Caldwell County, NC 37027
10                         NA    Catawba County, NC 37035
11                         NA    Iredell County, NC 37097
12                         NA     Wilkes County, NC 37193
13 Alleghany County, NC 37005  Alleghany County, NC 37005
14                         NA       Ashe County, NC 37009
15                         NA      Surry County, NC 37171
16                         NA     Wilkes County, NC 37193
17                         NA    Grayson County, VA 51077
18     Anson County, NC 37007      Anson County, NC 37007
19                         NA Montgomery County, NC 37123
20                         NA   Richmond County, NC 37153
我只对该链接中的北卡罗来纳州部分数据感兴趣,其中一部分是您在上面看到的:

#
nc_cc <- structure(list(c1 = c("Alamance County, NC", "", "", "", "", "", "", "Alexander County, NC", "", "", "", "", "Alleghany County, NC", "", "", "", "", "Anson County, NC", "", ""), cd1 = c(37001L, NA, NA, NA, NA, NA, NA, 37003L, NA, NA, NA, NA, 37005L, NA, NA, NA, NA, 37007L, NA, NA), c2 = c("Alamance County, NC", "Caswell County, NC", "Chatham County, NC", "Guilford County, NC", "Orange County, NC", "Randolph County, NC", "Rockingham County, NC", "Alexander County, NC", "Caldwell County, NC", "Catawba County, NC", "Iredell County, NC", "Wilkes County, NC", "Alleghany County, NC", "Ashe County, NC", "Surry County, NC", "Wilkes County, NC", "Grayson County, VA", "Anson County, NC", "Montgomery County, NC", "Richmond County, NC" ), cd2 = c(37001L, 37033L, 37037L, 37081L, 37135L, 37151L, 37157L, 37003L, 37027L, 37035L, 37097L, 37193L, 37005L, 37009L, 37171L, 37193L, 51077L, 37007L, 37123L, 37153L)), .Names = c("c1", "cd1", "c2", "cd2"), row.names = c(NA, 20L), class = "data.frame")
#
我用
data.table
标记了它,因为我在上面的解决方案中使用了它,我怀疑使用
roll
可以做一些很好的事情。真的,我从来没有理解过
roll
的文档,所以我希望在这里学到一些东西。。。那么:这可以用更好的方法吗


EDIT:也在问同样的问题,所以我将我的问题改为:“有没有更好的方法使用
数据表
或base R(因为我不喜欢安装更多的软件包)?”

这样做的标准方法是:

library(data.table)
dt = data.table(nc_cc)

dt[, cd1 := cd1[1], by = cumsum(!is.na(cd1))]

我找到了一个基于答案的
roll
解决方案

在我的应用程序中,它比@eddi(…和我,在陈述问题时)使用的
cumsum
答案复杂得多:


DT酷!我投了反对票;自从我提出第一个问题(很快收回)以来,我还没有遇到过这样的问题。如果有人知道一个优雅的非
cumsum
解决方案,我将不胜感激。总有一天,我会回来给你一笔赏金。现在,我将@eddi's标记为答案,尽管很明显他没有阅读这个问题(你知道,这个问题包含这个答案)。虽然你链接到的问题的答案需要zoo软件包,但它提供了一些很好的功能,比如
maxgap
fromLast
,这可能会派上用场。没有理由不能将
na.locf
data.table
一起使用。i、 e.
DT[,cd1:=na.locf(cd1)]
@GSee:谢谢你的指点;也许我应该安装它。我发现它没有依赖性,并且是最新的。我只是想避免(I)学习使用,以及(ii)使用几年后可能无法使用的东西。@down选民:如果这个问题有问题,你可以告诉我。我可以编辑,关闭或删除它,如果你能说服我什么是错的。。。
      cd1   cd2
 1: 37001 37001
 2: 37001 37033
 3: 37001 37037
 4: 37001 37081
 5: 37001 37135
 6: 37001 37151
 7: 37001 37157
 8: 37003 37003
 9: 37003 37027
10: 37003 37035
11: 37003 37097
12: 37003 37193
13: 37005 37005
14: 37005 37009
15: 37005 37171
16: 37005 37193
17: 37005 51077
18: 37007 37007
19: 37007 37123
20: 37007 37153
library(data.table)
dt = data.table(nc_cc)

dt[, cd1 := cd1[1], by = cumsum(!is.na(cd1))]
DT <- data.table(nc_cc)
setkey(DT[,i:=.I],i)

DT[
    DT[c1!=""][J(1:20),roll=TRUE][,list(c1,cd1),key=i],
    `:=`(c1=i.c1,cd1=i.cd1)
]