Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-累计金额-“累计金额”;例如;布尔向量上的运算_R_Data Manipulation - Fatal编程技术网

R-累计金额-“累计金额”;例如;布尔向量上的运算

R-累计金额-“累计金额”;例如;布尔向量上的运算,r,data-manipulation,R,Data Manipulation,我正在努力解决一个特殊的数据操作问题。我最近发布了这篇文章,有人建议在zoo库中使用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

我正在努力解决一个特殊的数据操作问题。我最近发布了这篇文章,有人建议在zoo库中使用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
我需要向下拖动日期列中的值,其中有空格(第4-6行全部为6月21日,第8-9行全部为6月23日,等等)。我理解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", ...]
    
  • 然后更新这些值

  • 我不知道如何做第二部分,如果我可以得到这个,那么我可以得到问题。我的助教建议使用cumsum()函数,可能是在布尔向量上(日期为空的1s/0s?)。我正在努力解决这个问题,非常感谢您的帮助

    编辑-可复制以帮助

    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") 
    
    for(i in 1:length(my_df$DATE)){
    如果(my_df$日期[i]=“”){
    
    my_df$DATE[i]我在共享链接中使用了一个解决方案:

    replace_na_with_last<-function(x,a=!is.na(x)){
        x[which(a)[c(1,1:sum(a))][cumsum(a)+1]]
    }
    

    replace\u na\u with_last您可以在日期为空时使用for循环和if语句将其替换为上一个值。查看可能的重复感谢我在这里使用了一个解决方案,请欣赏它,即使您不能使用
    na.locf
    本身,也可以查看它的源代码。是的这比我的方法简单得多
    replace_na_with_last<-function(x,a=!is.na(x)){
        x[which(a)[c(1,1:sum(a))][cumsum(a)+1]]
    }