R - 对布尔向量的累积和 - “喜欢”操作

时间:2017-02-06 20:37:37

标签: r data-manipulation

我正在努力解决特定的数据操作问题。我最近发布了这个,并在动物园库中建议了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如何使这个成为一个班轮,遗憾的是我无法使用它。

我的想法如下:

  1. 使用以下方法抓取需要拖动的日期:

    repeat_dates = my_df$DATE[which(my_df$FLIGHT == 1)-1]
    
  2. 创建一个矢量,其中包含重复每个日期的次数。这里3对应于将Jun 21向下拖动3行,2对于拖动Jun 23向下拖动2行等等。

    repeat_count = [3, 2, ...]
    
  3. 使用rep.int(repeat_dates,repeat_count)来获取向量:

    ["Jun 21", "Jun 21", "Jun 21", "Jun 23", "Jun 23", ...]
    
  4. 然后更新值

  5. 我不知道如何做第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") 
    

2 个答案:

答案 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在我班级中提到的方法,并且充分发挥作用,尽管最初的混淆是为了理解正在进行的索引。