R dplyr逐行执行

R dplyr逐行执行,r,dplyr,R,Dplyr,我正在寻找一种使用 dplyr包,类似于循环执行:我们只在更新前一行时才对下一行执行操作 比如说, X <- data.frame(a = c(1,NA,NA,NA)) for (i in 2:nrow(X)){ X$a[i] = X$a[i-1] + 1 } X a 1 1 2 2 3 3 4 4 你知道如何使用dplyr获得第一个输出吗 让我举一个更具体、更复杂的例子: > X <- data.frame(date_1 = c("2000-01-01

我正在寻找一种使用 dplyr包,类似于循环执行:我们只在更新前一行时才对下一行执行操作

比如说,

X <- data.frame(a = c(1,NA,NA,NA))
for (i in 2:nrow(X)){
    X$a[i] = X$a[i-1] + 1     
}
X
  a
1 1
2 2
3 3
4 4
你知道如何使用dplyr获得第一个输出吗

让我举一个更具体、更复杂的例子:

> X <- data.frame(date_1 = c("2000-01-01", "2001-01-01", NA, NA, NA, "2007-01-01", NA, NA),
+                 date_2 = c("2002-01-01", "2002-01-01", "2002-01-01", "2002-01-01", "2003-01-01", "2008-01-01", "2010-01-01", "2010-01-01"),
+                 stringsAsFactors=FALSE)
> X
      date_1     date_2
1 2000-01-01 2002-01-01
2 2001-01-01 2002-01-01
3       <NA> 2002-01-01
4       <NA> 2002-01-01
5       <NA> 2003-01-01
6 2007-01-01 2008-01-01
7       <NA> 2010-01-01
8       <NA> 2010-01-01
>
尝试:

这将产生:

#  a
#1 1
#2 2
#3 3
#4 4
编辑: 最新示例的解决方案:

X <- data.frame(date_1 = c("2000-01-01", "2001-01-01", NA, NA, NA, "2007-01-01", NA, NA),
                date_2 = c("2002-01-01", "2002-01-01", "2002-01-01", "2002-01-01", "2003-01-01","2008-01-01", "2010-01-01", "2010-01-01"), stringsAsFactors=FALSE)

X %>%
    group_by(date_2) %>%
    fill(date_1) %>%
    ungroup() %>%
    mutate(date_3 = lag(date_2)) %>%
    group_by(date_1, date_2) %>%
    mutate(date_3 = if_else(is.na(date_1), head(date_3,1), date_3)) %>%
    ungroup() %>%
    mutate(date_1 = if_else(is.na(date_1), date_3, date_1)) %>%
    select(date_1, date_2)

我希望这能有所帮助。

在使用软件包时尝试
x%>%fill(a)%>%mutate(a=a+which(!!a)-1)
。感谢您提供函数
fill()
,它实际上解决了许多问题。但我正在寻找更通用的方法来逐行执行代码。我将在下面建议一个更复杂的例子。请编辑问题并添加新的例子。这是一个与您最初提出的问题完全不同的问题。可能是我过于简化了前面的例子。我们的想法是,代码应该作为一个循环工作,只有当我们完成了数据帧的第1,…,i-1行时,我们才能对数据帧的第i行执行某些操作。
> X %>% mutate( date_1 = if_else(row_number() == 1, date_1,
+                         if_else(!is.na(date_1), date_1,
+                          if_else(date_2 == lag(date_2), lag(date_1),
+                                  lag(date_2))))
+         )
      date_1     date_2
1 2000-01-01 2002-01-01
2 2001-01-01 2002-01-01
3 2001-01-01 2002-01-01
4       <NA> 2002-01-01
5 2002-01-01 2003-01-01
6 2007-01-01 2008-01-01
7 2008-01-01 2010-01-01
8       <NA> 2010-01-01
library(tidyverse)


x %>%
    fill(a) %>%
    mutate(a = a+seq_along(a)-1)
x %>%
    fill(a) %>%
    mutate(a = a+which(!!a)-1)
#  a
#1 1
#2 2
#3 3
#4 4
X <- data.frame(date_1 = c("2000-01-01", "2001-01-01", NA, NA, NA, "2007-01-01", NA, NA),
                date_2 = c("2002-01-01", "2002-01-01", "2002-01-01", "2002-01-01", "2003-01-01","2008-01-01", "2010-01-01", "2010-01-01"), stringsAsFactors=FALSE)

X %>%
    group_by(date_2) %>%
    fill(date_1) %>%
    ungroup() %>%
    mutate(date_3 = lag(date_2)) %>%
    group_by(date_1, date_2) %>%
    mutate(date_3 = if_else(is.na(date_1), head(date_3,1), date_3)) %>%
    ungroup() %>%
    mutate(date_1 = if_else(is.na(date_1), date_3, date_1)) %>%
    select(date_1, date_2)
 date_1     date_2    
 2000-01-01 2002-01-01
 2001-01-01 2002-01-01
 2001-01-01 2002-01-01
 2001-01-01 2002-01-01
 2002-01-01 2003-01-01
 2007-01-01 2008-01-01
 2008-01-01 2010-01-01
 2008-01-01 2010-01-01