Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有没有一种简单的方法来处理sign()函数?_R - Fatal编程技术网

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