具有多个条件的 R 中的嵌套 if-else 循环

Nested if-else loop in R with multiple conditions

我需要编写一个嵌套循环来每年检查一次 ID,以便在 if-else 条件下比较来自数据帧 D1 和 D2 的多个变量。

D1:

ID    year         X1      
 1    2000      34563     
 1    2001      34563     
 1    2002      12367     
 2    2010      14363     
 2    2011      14363     
 2    2012      13312     
 2    2013      13312     
 2    2014      13312     

D2:

year       X1      X2      
2001    34563   12367  
2011    14363   13312  
 

我在 D1 中创建了 X2(X2 是 D1 中次年的 X1),方法是复制 X1 列并将其向上移动 1 行(这也是一个粗略的方法,因为如果 ID 和年份没有数据下一年的 X2 应填写为 NA,而不是数据框中下一个 ID 的 X1。)

对于 D1 中的 ID,我需要遍历该 ID 的每一年,以及 N 年,if

  1. D1$X1 == D2$X1
  2. D1$X2 == D2$X2

D1$G = 1 否则 D1$G = 0。

如果没有第N+1年的数据,则忽略条件2。

现在我想将 D1 中的每一行直接与 D2 进行比较。我尝试了一个 if-else 语句如下

D1$G <- ifelse(D1$X1 == D2$X1 & D1$X2 == D2$X2 & D1$year == D2$year, "1", "0")

不过,这就是我的结局

  ID   year      X1      X2    G
1  1   2000   34563   34563    0
2  1   2001   34563   12367    0
3  1   2002   12367   14363    0
4  2   2010   14363   14363    0
5  2   2011   14363   13312    0
6  2   2012   13312   13312    0
7  2   2013   13312   13312    0
8  2   2014   13312      NA    0

而不是

  ID   year      X1      X2    G
1  1   2000   34563   34563    0
2  1   2001   34563   12367    1
3  1   2002   12367   14363    0
4  2   2010   14363   14363    0
5  2   2011   14363   13312    1
6  2   2012   13312   13312    0
7  2   2013   13312   13312    0
8  2   2014   13312      NA    0

想了解我哪里出错了(或者是否有更简单的方法)。感谢任何帮助。

可重现代码:

D1 <- data.frame(ID = c(1, 1, 1, 2, 2, 2, 2, 2),
                 year = c(2000, 2001, 2002, 2010, 2011, 2012, 2013, 2014),
                 X1 = c(34563, 34563, 12367, 14363, 14363, 13312, 13312, 13312)
)
D2 <- data.frame(year = c(2001, 2011),
                 X1 = c(34563, 14363),
                 X2 = c(12367, 13312)
)

# creating X2 in D1
D1$X2 = D1$X1
D1$X2 <- shift(D1$X1, 1)

也许这会有所帮助。在1的D2中增加一个G列。然后,你可以合并两个data.frames,将没有匹配的NA替换为0。

library(tidyverse)

D2$G <- 1

D1 %>%
  group_by(ID) %>%
  mutate(X2 = lead(X1, 1)) %>%
  left_join(D2, by = c("year", "X1", "X2")) %>%
  replace_na(list(G = 0))

输出

     ID  year    X1    X2     G
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1  2000 34563 34563     0
2     1  2001 34563 12367     1
3     1  2002 12367    NA     0
4     2  2010 14363 14363     0
5     2  2011 14363 13312     1
6     2  2012 13312 13312     0
7     2  2013 13312 13312     0
8     2  2014 13312    NA     0

编辑:为了解释 ifelse 语句的问题,您正在比较两个不同长度的向量,这可能不是预期的方式。

考虑来自 data.frames 的两个向量:

year1 = c(2000, 2001, 2002, 2010, 2011, 2012, 2013, 2014)
year2 = c(2001, 2011)

如果使用 == 运算符进行比较:

year1 == year2

你将获得全部FALSE:

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

这实质上是按顺序比较 2000 年与 2001 年、2001 年与 2011 年、2002 年与 2001 年(同样,回收向量 year2 给出较短的长度)、2010 年与 2011 年、2011 年与 2001 年(再次)等。

另一种比较两个向量的方法是使用 %in%:

year1 %in% year2

[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE

这将根据向量 year2 中包含的 year1 中的每个值给出逻辑结果。