R R 中是否存在 SQL 中的 EXISTS 之类的东西?
R Does something like EXISTS in SQL exists in R?
EXISTS/NOT EXISTS 是 SQL 中非常强大的功能。
有没有一种方法可以使用 R 命令或函数来执行 SQL 中的 EXISTS?示例:
# Two tables
x0 <- data.frame(a=rep(1:4,2))
x1 <- data.frame(a=c(2,2,3,5))
我想要一个新指标 b 如果 x0 中的值存在于 table x1 中则为 1 否则为 0 .
# Initialize b
x0$b <- 0
# Update b
sqldf(c("UPDATE x0
SET b = 1
WHERE EXISTS (SELECT 1
FROM x1
WHERE x0.a = x1.a
)"
, "SELECT * FROM main.x0"
)
)
结果:
a b
1 1 0
2 2 1
3 3 1
4 4 0
5 1 0
6 2 1
7 3 1
8 4 0
试试这个:
x0$b <- (x0$a %in% x1$a) + 0L
使用 0L
而不是 0
主要是我有点迂腐;它确保一切都保持为整数而不是数字(双精度)。
!(x0$a %in% x1$a) + 0L
returns 布尔值而不是整数的原因是运算符优先级。最后应用否定。尝试将它向右移动一个位置作为括号内的第一件事:(!x0$a %in% x1$a) + 0L
正如@Roland 指出的那样,如果您发现整个 + 0L
有点太聪明以至于不清楚,您可以随时做 as.integer(x0$a %in% x1$a)
.
EXISTS/NOT EXISTS 是 SQL 中非常强大的功能。 有没有一种方法可以使用 R 命令或函数来执行 SQL 中的 EXISTS?示例:
# Two tables
x0 <- data.frame(a=rep(1:4,2))
x1 <- data.frame(a=c(2,2,3,5))
我想要一个新指标 b 如果 x0 中的值存在于 table x1 中则为 1 否则为 0 .
# Initialize b
x0$b <- 0
# Update b
sqldf(c("UPDATE x0
SET b = 1
WHERE EXISTS (SELECT 1
FROM x1
WHERE x0.a = x1.a
)"
, "SELECT * FROM main.x0"
)
)
结果:
a b
1 1 0
2 2 1
3 3 1
4 4 0
5 1 0
6 2 1
7 3 1
8 4 0
试试这个:
x0$b <- (x0$a %in% x1$a) + 0L
使用 0L
而不是 0
主要是我有点迂腐;它确保一切都保持为整数而不是数字(双精度)。
!(x0$a %in% x1$a) + 0L
returns 布尔值而不是整数的原因是运算符优先级。最后应用否定。尝试将它向右移动一个位置作为括号内的第一件事:(!x0$a %in% x1$a) + 0L
正如@Roland 指出的那样,如果您发现整个 + 0L
有点太聪明以至于不清楚,您可以随时做 as.integer(x0$a %in% x1$a)
.