我正在努力解决特定的数据操作问题。我最近发布了这个,并在动物园库中建议了na.locf函数,但这是一个功课问题而且TA指定不加载其他库来解决这个问题,所以我需要使用更传统的数据操作方法。我们给出了以下数据框,我展示了前10行:
my_df[1:10,1:2]
DATE FLIGHT
1 May 26 NA
2 Jun 10 NA
3 Jun 21 NA
4 1
5 2
6 3
7 Jun 23 NA
8 1
9 2
10 Jun 25 NA
我需要在DATE列中向下拖动值,其中有空白(6月21日的行4-6,6月23日的行8-9等)。我理解na.locf如何使这个成为一个班轮,遗憾的是我无法使用它。
我的想法如下:
使用以下方法抓取需要拖动的日期:
repeat_dates = my_df$DATE[which(my_df$FLIGHT == 1)-1]
创建一个矢量,其中包含重复每个日期的次数。这里3对应于将Jun 21向下拖动3行,2对于拖动Jun 23向下拖动2行等等。
repeat_count = [3, 2, ...]
使用rep.int(repeat_dates,repeat_count)来获取向量:
["Jun 21", "Jun 21", "Jun 21", "Jun 23", "Jun 23", ...]
然后更新值
我不知道如何做第2部分,如果我能得到这个,那么我可以解决问题。我的TA建议使用cumsum()函数,可能是布尔值向量(1 / 0s,其中DATE是空白的?)。我正在努力解决这个问题,感谢任何帮助!
编辑 - 可重复帮助
dput(my_df[1:20,1:2])
structure(list(DATE = structure(c(-23961, -23946, -23935, NA,
NA, NA, -23933, NA, NA, -23931, -23911, -23893, NA, NA, -23891,
NA, NA, -23890, NA, NA), class = "Date"), FLIGHT = c(NA, NA,
NA, 1L, 2L, 3L, NA, 1L, 2L, NA, NA, NA, 1L, 2L, NA, 1L, 2L, NA,
1L, 2L)), .Names = c("DATE", "FLIGHT"), row.names = c(NA, 20L
), class = "data.frame")
答案 0 :(得分:1)
for(i in 1:length(my_df$DATE)){
if(my_df$DATE[i]==""){
my_df$DATE[i] <- my_df$DATE[i-1]
}
}
答案 1 :(得分:0)
我选择了共享链接中的解决方案:
replace_na_with_last<-function(x,a=!is.na(x)){
x[which(a)[c(1,1:sum(a))][cumsum(a)+1]]
}
我认为这是TA在我班级中提到的方法,并且充分发挥作用,尽管最初的混淆是为了理解正在进行的索引。