Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取嵌套for循环中的第二个索引以在数据表中工作_R_Loops_Data.table_Increment - Fatal编程技术网

如何获取嵌套for循环中的第二个索引以在数据表中工作

如何获取嵌套for循环中的第二个索引以在数据表中工作,r,loops,data.table,increment,R,Loops,Data.table,Increment,因此,我有一个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

因此,我有一个
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   ...
我需要弄清楚的是,如何使用沿着列1的索引滑动的assignmentbyreference语句编写
for
循环。基本上

对于每个列索引,一次一个:

  • 对于每个
    V1=1
    V2=1
    将字符“a”替换为一个 0.0055+rnorm(1,0.0055,0.08)的迭代
  • 对于每个
    V1=1
    V2=2
    用0.0055的一次迭代替换字符“a”+ rnorm(1,0.0055,0.08)。(相同的变化,但另一次迭代 (诺姆)
  • 对于每个
    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)(相同的变化,但另一次迭代 (参考文献)
对于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中的值重复了一定的次数Column1有300k以上的值,因此滑动循环需要动态可伸缩。

以下是我尝试过的:

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)]
    }}

谢谢

如果我正确理解您的问题,这可能会有所帮助

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]
库(data.table)

dt好的,所以我发现我没有正确地增加计数器。对于第一列中有4000个场景的矩阵/数据表,第二列中每个场景有11个重复,我使用了以下方法:

 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}

Col1counter根据您的描述,结果似乎取决于V1,但您在示例中使用的是V3。是V3=ifelse(V1==1,“a”,“b”)对不起,它应该是V3而不是V55。我正在用一个数字替换V3中a或b的值。我已经编辑了答案以使用V3