我有通过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"
答案 0 :(得分:1)
我们根据原始数据集&#39; temp&#39;创建行名称,根据temp中行号的最小值和最大值,创建另一个数据集(&#39; df2&#39;) ,left_join
或NA
数据集,并使用na.locf
中的library(zoo)
填充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
元素。
{{1}}