Как я могу запрограммировать n шагов, где каждый шаг - это кадр данных, созданный из предыдущего шага? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь смоделировать изменения во фрейме данных с помощью разных шагов в зависимости друг от друга. Давайте попробуем взять очень простой пример, чтобы проиллюстрировать мою проблему.

Я создаю фрейм данных с двумя столбцами

a=runif(10)
b=runif(10)
data_1=data.frame(a,b)
data_1
            a          b
1  0.94922669 0.47418098
2  0.26702201 0.79179699
3  0.57398333 0.25158378
4  0.52724079 0.61531202
5  0.03999831 0.95233479
6  0.15171673 0.64564561
7  0.51353129 0.75676464
8  0.60312432 0.85318316
9  0.52900913 0.06297818
10 0.75459362 0.40209925

Затем я хотел бы создать n шагов, где каждый шаг состоит в создании нового фрейма данных в i + 1, который является функцией (назовем это «что угодно») фрейма данных в i: data_2 является преобразованием data_1, данные_3 преобразование данных_2 и т. д.

iterations=function(nsteps)
{
  lapply(1:nsteps,function(i)
  {  
  data_i+1=whatever(data_i)
  })

}

Независимо от того, какую функцию я использую, у меня появляется сообщение об ошибке:

Error in whatever(data_i) : object 'data_i' not found 

Может ли кто-нибудь помочь мне понять, чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Возможно, вы ищете комбинацию assign и paste:

assign(paste("data_", i + 1, sep = ""), whatever(data_i))
0 голосов
/ 13 мая 2019

Посмотрите, можете ли вы получить вдохновение из следующего примера.
Во-первых, функция whatever, применяемая к предыдущему фрейму данных.

whatever <- function(DF) {
  DF[[2]] <- DF[[2]]*2
  DF
}

Теперь функция, которую вы хотите. Я добавил дополнительный аргумент, фрейм данных x.
Функция начинается с создания возвращаемого объекта. Каждый член списка data_list будет функцией кадра данных предыдущего кадра данных.

iterations <- function(nsteps, x){
  data_list <- vector("list", length = nsteps)
  data_list[[1]] <- x
  for(i in seq_len(nsteps)[-1]){
    data_list[[i]] <- whatever(data_list[[i - 1]])
  }
  names(data_list) <- sprintf("data_%d", seq_len(nsteps))
  data_list
}

И применить iterations к примеру кадра данных.

df1 <- data.frame(A = letters[1:10], X = 1:10)

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