通过table/cumsum命令生成以下表:
> temp
numCars
18 1
17 2
16 8
15 18
14 25
13 29
12 42
11 55
10 70
9 134
8 160
7 172
6 177
5 180
3 181
2 181
1 181
0 181
temp <- structure(c(1L, 2L, 8L, 18L, 25L, 29L, 42L, 55L, 70L, 134L, 160L,
172L, 177L, 180L, 181L, 181L, 181L, 181L), .Dim = c(18L, 1L), .Dimnames = list(
c("18", "17", "16", "15", "14", "13", "12", "11", "10", "9",
"8", "7", "6", "5", "3", "2", "1", "0"), "numCars"))
可以看到,缺少名称为4的行。在R中,最简单的填充方法是什么呢?这里的值应该是较低的数字(在本例中是181)。
我知道我可以用一个混乱的for循环来做到这一点,我可以进去,调整大小,创建一个新的DF,然后放入任何空白值。我只是想知道有没有更好的办法?
表代码如下:
cohortSizeByMileage <- data.matrix(cumsum(rev(table(cleanMileage$OdometerBucket))))
colnames(cohortSizeByMileage) <- "numCars"
我们从原始数据集'temp'创建行名作为列,基于temp中行号的最小值和最大值,创建另一个数据集('df2'), merge
或left_join
为数据集,并使用library(zoo)
中的na.locf
填充NA
元素。
df1 <- data.frame(numCars=temp[[1]], rn1=as.numeric(row.names(temp)))
df2 <- data.frame(rn1= max(df1$rn1):min(df1$rn1))
library(dplyr)
library(zoo)
left_join(df2, df1) %>%
mutate(numCars= na.locf(numCars,fromLast=TRUE ))
# rn1 numCars
#1 18 1
#2 17 2
#3 16 8
#4 15 18
#5 14 25
#6 13 29
#7 12 42
#8 11 55
#9 10 70
#10 9 134
#11 8 160
#12 7 172
#13 6 177
#14 5 180
#15 4 181
#16 3 181
#17 2 181
#18 1 181
#19 0 181