具有多个条件的 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
- D1$X1 == D2$X1
- 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
中的每个值给出逻辑结果。
我需要编写一个嵌套循环来每年检查一次 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
- D1$X1 == D2$X1
- 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
中的每个值给出逻辑结果。