Решите итеративно данные в R - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь построить фрейм данных (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 голосов
/ 29 апреля 2018

Мне неясно, зачем вам нужно такое сложное решение для такой простой операции (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]]
} 
0 голосов
/ 29 апреля 2018

Ну, я не знаю, что вы пытаетесь выполнить, но я думаю, что определенная вами функция должна быть исправлена. Вы можете сделать это следующим образом, хотя ответ не является правильным.

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
0 голосов
/ 29 апреля 2018

Первое создание данных:

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)) для достижения вышеизложенного, но вышеприведенная функция цикла будет работать для вас, если вам нужно решить ее итеративно, используя традиционный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...