我正在尝试基于以下关系构建数据帧(df2):df1 [i,j] = df2 [i,j] ^ 2。为此,我需要求解一个非线性方程组:
library(nleqslv)
df1 = data.frame(a = c(9,9), b = c(9,9))
df2 = df1
for(i in colnames(df1)){
f = function(x) {df1[i] - x^2}
xstart = c(df2[i])
df2[i] = nleqslv(xstart, f)[[1]]
}
预期结果是:
a b
1 3 3
2 3 3
但是我收到以下错误消息:
Error in nleqslv(xstart, f) :
Argument 'x' cannot be converted to numeric!
不确定导致问题的原因。你能给我一些建议吗?
答案 0 :(得分:3)
好吧,我不知道你要完成什么,但我认为你定义的功能必须修复。您可以通过以下方式执行此操作,但答案不正确。
f <- function(x) x - x^2
df1 = data.frame(a = c(9,9), b = c(9,9))
sapply(df1, function(y) nleqslv(y, f)[[1]])
您应该使用sqrt()
,因为它是矢量化的。
sqrt(df1)
# a b
# 1 3 3
# 2 3 3
答案 1 :(得分:2)
我不清楚为什么你需要这么复杂的解决方案进行这么简单的操作(df2 <- sqrt(df1)
会产生你的示例解决方案)。但是如果你想知道是什么产生了那个错误,那就归结为R索引如何列出。
df1[1]
会返回列表,而df1[[1]]
(双括号)会返回向量。 nleqslv函数需要向量。因此,我们所要做的就是修改现有代码以使用双括号而不是单个括号:
library(nleqslv)
df1 = data.frame(a = c(9,9), b = c(9,9))
df2 = df1
for(i in colnames(df1)){
f = function(x) {df1[[i]] - x^2}
xstart = c(df2[[i]])
df2[i] = nleqslv(xstart, f)[[1]]
}
答案 2 :(得分:0)
首先创建数据:
df2 <- data.frame(a=c(9,9), b=c(9,9))
df1 <- df2
现在迭代地解决它,这是R代码:
for(i in 1:nrow(df1)){
for(j in 1:ncol(df1)){
df2[i, j] <- sqrt(df1[i,j])
}
}
df2
这将返回:
<dbl>
a b
3 3
3 3
您可以使用矢量化解决方案(df2 <- sqrt(df1)
)来实现上述目标,但如果您需要使用传统循环迭代求解,上面的循环函数将适用于您。