在我的R代码中,我遇到了一个非常奇怪的问题.以下是我拥有的一些值的示例以及将这些值取为1/10时的结果.请注意每个值是如何变成NaN的.

vals <- c(-0.02964166, -0.01018776, -0.01758487)
vals^(1/10)

[1] NaN NaN NaN

但如果我把数字分别取到1/10,我得到的不是NaN,而是值.

-0.02964166^(1/10)

[1] -0.7033804

-0.01018776^(1/10)

[1] -0.6321321

-0.01758487^(1/10)

[1] -0.6675963

这是怎么回事,我怎么才能在向量上执行这个运算,这样我才不会丢失数字?

推荐答案

这是R FAQ 7.33的变体,与unary minus运算符的优先顺序有关:-0.1^0.1(例如)被解析为-(0.1^0.1).当您将表达式放入向量中时,-的计算结果是before^.

sign(vals)*(abs(vals))^(1/10)

非常迂腐,你可以这样得到one个复杂的根:

as.complex(vals)^(1/10)
[1] 0.6689545+0.2173565i 0.6011934+0.1953396i 0.6349218+0.2062986i

all根这样的根

polyroot(c(-vals[1], rep(0,9), 1))
 [1]  0.4134366+0.5690467i -0.4134366+0.5690467i -0.4134366-0.5690467i
 [4]  0.6689545-0.2173565i  0.0000000+0.7033804i -0.6689545+0.2173565i
 [7]  0.0000000-0.7033804i  0.6689545+0.2173565i -0.6689545-0.2173565i
[10]  0.4134366-0.5690467i

(这会找到方程式1*x^10 + 0*x^9 + ... + 0*x - val == 0的根,即x^10 - val = 0)

从技术上讲,我认为(除非我弄错了)您正在寻找的实际根是第五个根(0.0000000+0.7033804i);这与sign(x)*(abs(x)^(1/10))的答案相比相差了i倍……我们可以确认答案should是纯想象的,即

all.equal((0.7033804i)^10, as.complex(vals[1]), tol = 1e-6)

是真的.

R相关问答推荐

从载体创建 pyramid

如何修复R码的置换部分?

在"gt"表中添加第二个"groupname_col",而不连接列值

如何在kableextra调用cell_spec()中忽略NA?

在R中,如何在每个堆叠的条上放置误差条,特别是当使用facet_grid时?

如何在区分不同条件的同时可视化跨时间的连续变量?

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

Select 季度月值

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

R如何计算现有行的总和以添加新的数据行

根据另一列中的值和条件查找新列的值

从多个可选列中选取一个值到一个新列中

如果COLSUM为>;0,则COLNAME为向量

观察器中的inaliateLater的位置

优化从每个面的栅格中提取值

解析嵌套程度极高的地理数据

按组和连续id计算日期差

如何为混合模型输出绘制不同的线型?

将美学添加到ggploy中的文本标签