在R中迭代地解决数据帧

时间:2018-04-29 16:20:55

标签: r

我正在尝试基于以下关系构建数据帧(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!

不确定导致问题的原因。你能给我一些建议吗?

3 个答案:

答案 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))来实现上述目标,但如果您需要使用传统循环迭代求解,上面的循环函数将适用于您。