R 有没有一种简单的方法来处理sign()函数?
我写了一个函数,它使用符号函数来找出给定向量中哪些数字是正的,哪些是负的。我想知道是否有一种简单的方法可以在不使用符号函数的情况下获得像+和-这样的字符向量。使用符号函数有什么困难 这里有几个选项,它们看起来都很简单,但是你可以使用任何你喜欢的R 有没有一种简单的方法来处理sign()函数?,r,R,我写了一个函数,它使用符号函数来找出给定向量中哪些数字是正的,哪些是负的。我想知道是否有一种简单的方法可以在不使用符号函数的情况下获得像+和-这样的字符向量。使用符号函数有什么困难 这里有几个选项,它们看起来都很简单,但是你可以使用任何你喜欢的 cut(x, breaks = c(-Inf, 0, Inf), labels = c("+", "-")) factor(sign(x), levels = c(-1, 1), labels = c("-", "+")) ifelse(x < 0
cut(x, breaks = c(-Inf, 0, Inf), labels = c("+", "-"))
factor(sign(x), levels = c(-1, 1), labels = c("-", "+"))
ifelse(x < 0, -1, 1)
ifelse(sign(x) == -1, "+", "-")
c("+", "-")[(x < 0) + 1L]
sub("1", "+", sub("-1", "-", sign(x))) # from comments
你能提供一些数据来说明你在做什么吗?还有,为什么不用一个不等式来检查符号呢?我读这篇文章是因为你想重新实现sign函数,这似乎是一个奇怪的请求。我读对了吗?为什么要这样做?您可以始终使用ifelse.或sub1,+,sub-1,-,signx。您的问题意味着您测试的数字将是正的或负的,但sign生成三个可能的答案-1,0和1。您的输入永远不会为零吗?更不用说,如果您将内置的signx函数添加到基准测试中,它的速度大约是vector_index的4倍!
n = 1000
x = runif(n, min = -1, max = 1)
print(microbenchmark::microbenchmark(
cut = cut(x, breaks = c(-Inf, 0, Inf), labels = c("+", "-")),
factor = factor(sign(x), levels = c(-1, 1), labels = c("-", "+")),
ifelse_direct = ifelse(x < 0, -1, 1),
ifelse_sign = ifelse(sign(x) == -1, "+", "-"),
vector_index = c("+", "-")[(x < 0) + 1L],
double_sub = sub("1", "+", sub("-1", "-", sign(x))),
times = 10
), order = "mean")
# Unit: microseconds
# expr min lq mean median uq max neval cld
# vector_index 13.650 14.542 14.9753 15.1135 15.600 16.202 10 a
# ifelse_direct 62.070 64.065 83.4343 64.7030 68.473 170.470 10 a
# ifelse_sign 193.101 197.737 225.5119 203.9010 209.966 354.551 10 b
# cut 189.734 190.560 244.9517 207.7210 240.709 472.329 10 b
# factor 514.649 516.468 571.2281 541.8715 553.215 899.395 10 c
# double_sub 1295.653 1309.340 1376.3982 1381.7635 1420.775 1502.250 10 d
print(microbenchmark::microbenchmark(
cut = cut(x, breaks = c(-Inf, 0, Inf), labels = c("+", "-")),
factor = factor(sign(x), levels = c(-1, 1), labels = c("-", "+")),
ifelse_direct = factor(ifelse(x < 0, -1, 1), levels = c("-", "+")),
ifelse_sign = factor(ifelse(sign(x) == -1, "+", "-"), levels = c("-", "+")),
vector_index = factor(c("+", "-"), levels = c("-", "+"))[(x < 0) + 1L],
double_sub = factor(sub("1", "+", sub("-1", "-", sign(x))), levels = c("-", "+")),
times = 10
), order = "mean")
# Unit: microseconds
# expr min lq mean median uq max neval cld
# vector_index 22.968 24.742 29.5399 26.5030 33.719 41.736 10 a
# ifelse_sign 205.342 206.831 214.7748 211.4585 217.641 237.253 10 b
# cut 203.333 228.458 242.2857 234.2420 255.290 324.423 10 b
# factor 516.720 519.264 539.4255 524.8190 541.624 609.298 10 c
# ifelse_direct 568.426 570.917 575.7954 573.8430 577.363 599.899 10 d
# double_sub 1316.820 1320.598 1333.2738 1326.0780 1343.518 1363.342 10 e