条件变异 - 使用 coalesce 创建一个新变量
Conditional mutate - creating a new variable with coalesce
我正在从网站上抓取数据,具体取决于页面的结构。我在最后的 table 中有一个内部连接,它要么在 WON 和 LOST 变量上连接干净,要么我需要执行清理步骤以将四个变量合并到 WON 和 LOST 中。
我的问题是,我编写的代码始终采用脏连接(粗体突变)。
Error in `mutate()`:
! Problem while computing `WON.x = coalesce(WON.x, WON.y)`.
Caused by error in `list2()`:
! object 'WON.x' not found
我相信解决方案是,如果存在脏连接(即,WON 和 LOST 变为 WON.x、WON.y、[=24,我只需要将两个突变变为 运行 =], LOST.y).
我无法解决这个问题,并尝试了使用“匹配”、“跨(any_of)”等各种方法,但我无法让它工作。我想我在试图包含 coalesce 的语法中混淆了。
只有在某些其他列存在的情况下,才能像这样改变和合并任何帮助。谢谢
final=inner_join(temp1,temp2, by="id") %>%
select(-any_of(c("DRAW.x", "DRAW.y"))) %>%
**mutate(WON.x = coalesce(WON.x,WON.y)) %>%
mutate(LOST.x =coalesce(LOST.x,LOST.y)) %>%**
select(-any_of(c("WON.y","LOST.y"))) %>%
rename(WON=WON.x, LOST=LOST.x)```
不是所有东西都应该挤进管道里。我会做以下事情:
library(tidyverse)
## These two give a clean join:
temp1 <- tibble(id = 1:3,
WON= 5:7)
temp2 <- tibble(id = 1:3,
LOST = 3:5)
## These two give a dirty join:
temp1 <- tibble(id = 1:3,
WON = 5:7,
LOST = c(3L, NA, 5L))
temp2 <- tibble(id = 1:3,
WON = c(NA, NA, 7L),
LOST = 3:5)
final <- inner_join(temp1, temp2, by = "id")
if("WON.y" %in% names(final)){
final <- final %>%
mutate(WON = coalesce(WON.x, WON.y),
LOST = coalesce(LOST.x, LOST.y),
.keep = "unused")
}
final
老实说,我想不出直接在管道中执行此操作的明确方法。写一个深奥的 one-liner 只是为了让它适合管道并不是一个好主意。即使必须中断管道,清晰的代码也是最好的。
如果您坚持,您可以编写一个可通过管道传输的小函数。但随后 reader 必须关闭并找到其他代码,该代码实际上也不在管道中。
我正在从网站上抓取数据,具体取决于页面的结构。我在最后的 table 中有一个内部连接,它要么在 WON 和 LOST 变量上连接干净,要么我需要执行清理步骤以将四个变量合并到 WON 和 LOST 中。
我的问题是,我编写的代码始终采用脏连接(粗体突变)。
Error in `mutate()`:
! Problem while computing `WON.x = coalesce(WON.x, WON.y)`.
Caused by error in `list2()`:
! object 'WON.x' not found
我相信解决方案是,如果存在脏连接(即,WON 和 LOST 变为 WON.x、WON.y、[=24,我只需要将两个突变变为 运行 =], LOST.y).
我无法解决这个问题,并尝试了使用“匹配”、“跨(any_of)”等各种方法,但我无法让它工作。我想我在试图包含 coalesce 的语法中混淆了。
只有在某些其他列存在的情况下,才能像这样改变和合并任何帮助。谢谢
final=inner_join(temp1,temp2, by="id") %>%
select(-any_of(c("DRAW.x", "DRAW.y"))) %>%
**mutate(WON.x = coalesce(WON.x,WON.y)) %>%
mutate(LOST.x =coalesce(LOST.x,LOST.y)) %>%**
select(-any_of(c("WON.y","LOST.y"))) %>%
rename(WON=WON.x, LOST=LOST.x)```
不是所有东西都应该挤进管道里。我会做以下事情:
library(tidyverse)
## These two give a clean join:
temp1 <- tibble(id = 1:3,
WON= 5:7)
temp2 <- tibble(id = 1:3,
LOST = 3:5)
## These two give a dirty join:
temp1 <- tibble(id = 1:3,
WON = 5:7,
LOST = c(3L, NA, 5L))
temp2 <- tibble(id = 1:3,
WON = c(NA, NA, 7L),
LOST = 3:5)
final <- inner_join(temp1, temp2, by = "id")
if("WON.y" %in% names(final)){
final <- final %>%
mutate(WON = coalesce(WON.x, WON.y),
LOST = coalesce(LOST.x, LOST.y),
.keep = "unused")
}
final
老实说,我想不出直接在管道中执行此操作的明确方法。写一个深奥的 one-liner 只是为了让它适合管道并不是一个好主意。即使必须中断管道,清晰的代码也是最好的。
如果您坚持,您可以编写一个可通过管道传输的小函数。但随后 reader 必须关闭并找到其他代码,该代码实际上也不在管道中。