Как я могу получить второй индекс внутри вложенного цикла for для работы в таблице данных - PullRequest
0 голосов
/ 01 февраля 2019

Итак, у меня есть data.table, где мне нужно заполнить значения на основе индекса столбца, а затем также на основе символа-заполнителя.Пример:

       V1   V2   V3    V4
Row1   1    1    a     d     
Row2   1    1    a     d
Row3   1    1    a     d
Row4   1    2    a     h
Row5   1    2    a     h
Row6   1    2    a     h
Row7   2    1    b     i
Row8   2    1    b     i
Row9   2    1    b     i
Row10  2    2    b     t
Row11  2    2    b     t
Row12  2    2    b     t

....
Row350k   ...

Мне нужно выяснить, как написать цикл for с оператором присваивания по ссылке, который скользит по индексу столбца 1.В основном

Для каждого индекса столбца, по одному за раз:

  • Для каждого V1 = 1 и V2 = 1 замените символ 'a' одной итерацией 0,0055 + rnorm (1,0,0055, 0,08).
  • Для каждого V1 = 1 и V2 = 2 заменить символ 'a' одной итерацией 0,0055 + rnorm (1, 0,0055, 0,08).(тот же вариант, но с другой итерацией rnorm)
  • Для каждого V1 = 2 и V1 = 1 замените символ 'b' одной итерацией 0,0055 + rnorm (1, 0,001, 0,01)
  • Для каждого V1 = 2 и V1 = 1 замените символ 'b' одной итерацией 0,0055 + rnorm (1, 0,001, 0,01) (то же самое изменение, но с другой итерацией rnorm).

И так далее для каждого возрастающего значения Col1 и Col2.На самом деле это 20+ строк вместо 2 для второго индекса.

В таком случае желаемым выводом будет:

    Col1  Col2   Col3     Col4
Row1   1    1    0.00551    d     
Row2   1    1    0.00551    d
Row3   1    1    0.00551    d
Row4   1    2    0.00553    h
Row5   1    2    0.00553    h
Row6   1    2    0.00555    h
Row7   2    1    0.0011     i
Row8   2    1    0.0011     i
Row9   2    1    0.0011     i
Row10  2    2    0.0010     t
Row11  2    2    0.0010     t
Row12  2    2    0.0010     t
....
Row350k   ...

Просто не уверен, как это сделать с циклом, так как значения в col1повторяются определенное количество раз. Столбец1 имеет более 300 тыс. Значений, поэтому скользящий цикл необходимо динамически масштабировать.

Вот что я пробовал:

for (i in seq(1, 4000, 1)) 
{for (ii in seq(1, 2, 1)) {
    data.table[V3 == "a" , V3 := 0.0055 + rnorm(1, 0.0055, 0.08)]
    data.table[V3 == "b" , V3 := 0.0055 + rnorm(1, 0.001, 0.01)]
    }}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Хорошо, я понял, что неправильно увеличиваю свои счетчики.Для таблицы матрицы / данных с 4000 сценариями в 1-м столбце, каждый из которых содержит 11 повторов во 2-м столбце, я использовал следующее:

 Col1counter <- 1
 Col2counter <- 1

for(Col1counter in 1:4000) {

  for(col2counter in 1:11) {

     test1[V1 == col1counter & V2 == col2counter &  V3 == "a" ,  V55 := 0.00558 + rnorm(1, 0.00558, 2)]

  col2counter+ 1
    }
Col1counter+ 1}

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

0 голосов
/ 01 февраля 2019

Если я правильно понимаю вашу проблему, это может помочь.

library(data.table)

dt <- data.table(V1 = c(rep(1, 6), rep(2, 6)), 
                 V2 = rep(c(rep(1, 3), rep(2, 3)), 2),
                 V3 = c(rep("a", 6), rep("b", 6)),
                 V4 = c(rep("d", 3), rep("h", 3), rep("i", 3), rep("t", 3)))

# define a catalog to join on V3 which contains the parameters for the random number generation
catalog <- data.table(V3 = c("a", "b"),
                      const = 0.0055,
                      mean = c(0.0055, 0.001),
                      std = c(0.08, 0.01))

# for each value of V3 generate .N (number of observations of the current V3 value) random numbers with the specified parameters
dt[catalog, V5 := i.const + rnorm(.N, i.mean, i.std), on = "V3", by = .EACHI]
dt[, V3 := V5]
dt[, V5 := NULL]
...