R:循环遍历data.frames列表以生成连续的坐标集

时间:2015-05-20 22:20:19

标签: r loops 3d dataframe coordinates

编辑:抱歉,当我与桌面布局作斗争时,我没有看到帖子被裁剪掉了。 总结一下这个问题,我想知道编写迭代计算的最佳(也是最有效)方法是什么?

在下面的例子中可能不够清楚的一般想法实际上非常简单。

我有一个表(M.Motion)的列表,其中填充了坐标(M)和向量。每个向量是Mn和Mn-1之间的距离。

我有一个表(SalOrigine),这是一张图片转换为一张表格,每张图片中的每个像素都有一对坐标(288 * 162)。每组(M)坐标是在3D空间中投影的一张图片的中心。

我的目标是使用运动矢量和每个的坐标,从(M.Motion)列表计算每张图片的每个像素的位置 >(M)。 第一张图片在空间中始终具有相同的起始位置,并且以下图片具有顺序方式。 为此,我想计算第一个(SalOrigine)表,然后从中启动一个迭代循环,以便生成具有新坐标的Sal(n)表。每个 Sal(n)使用前面的 Sal(n-1)坐标集和(M.Motion)中的数据

我无法在R中获得工作脚本!

编辑结束/

情况如下:

  • 我有一个包含一行数百个数据帧的列表。 M(x,y,z)是点,dM(x,y,z)是从点(n)到点(n + 1)的矢量。基本上,每个点都是平面的中心,矢量是两个平面之间的距离。

    >head(M.Motion)
    
    $`1`
    M.X   M.Y   ID  t      M.Z     M.dX M.dY M.dZ M.Yfov
    1     1     1   0.014  1       0    0    0    954.85
    
    $`2`
    M.X   M.Y   ID  t      M.Z     M.dX M.dY M.dZ M.Yfov
    2.5   2.5   2   0.016  2.5     1.5  1.5  1.5    954.88
    
    etc.
    
  • 我还有一个"空白"数据框我将用于启动循环。它是(x,y)上288x162像素平面中每个像素的中心列表。

    >head(SalOrigine)
    
    ID S.X  S.Y S.Z
    1  0.5  0   0.5
    2  1.5  0   0.5
    3  2.5  0   0.5
    
    etc.
    
  • 我想创建一个脚本,生成一个新的data.frame,并为M.Motion的每一帧提供一组新的坐标。 含义,从SalOrigine开始:

-S.X2 =(SX + M.Motion $ 1 $ MX + M.Motion $ 1 $ M.dX -144.5)#-144.5用于校正S.X2的位置,因为MX是图片的中心

-S.Y2 =(S.Y + M.Motion $ 1 $ M.Y + M.Motion $ 1 $ M.dY)

-S.Z2 =(S.Z + M.Motion $ 1 $ M.Z + M.Motion $ 1 $ M.dZ -81.5)#same as -144.5

然后我会

    >head(Sal1) fake values

    ID S.X  S.Y S.Z  M.dX M.dY M.dZ S.X2   S.Y2  S.Z2
    1  0.5  0   0.5  2    3    5    485.5  85.5  45.5
    2  1.5  0   0.5  2    3    5    486.5  86.5  46.5
    3  2.5  0   0.5  2    3    5    487.5  87.5  47.5

    etc.

从这里开始,想法是从Sal(n-1)的坐标计算每个Sal(n),并添加相关的点M(x,y,z)和向量dM(x,y,z)这样:

-Sal2 $ S.X2 =(Sal1 $ S.X2 + M.Motion $ 2 $ M.X + M.Motion $ 2 $ M.dX -144.5)

  • 此图片背后的项目总结如下:

http://tof.canardpc.com/view/297db212-3bd5-457d-b949-5099a1027ad0.jpg

1 个答案:

答案 0 :(得分:0)

我不完全确定我理解你要找的是什么,看起来你似乎没有关于如何接近任何特定部分的问题。 话虽如此,我还是抨击了我认为你在寻找的东西。

    library(data.table)

for(l in M.Motion){ #making a dataframe out of the list
  if(!exists('dfmotion')) dfmotion  <- l
  else dfmotion <- rbind(dfmotion, l)
}

#setting it data.table
dfmotion  <- as.data.table(dfmotion)
SalOrigine  <- as.data.table(SalOrigine)

#setting merge keys
setkey(dfmotion, ID)
setkey(SalOrigine, ID)

#combining sal & motion
combined  <- SalOrigine[dfmotion]

#doing the requested row based operations
combined[, ':=' (S.X2 = (S.X + M.X + M.dX -144.5),
                 S.Y2 = (S.Y + M.Y + M.dY),
                 S.Z2 = (S.Z + M.Z + M.dZ -81.5))]
combined[, S.X2 := S.X2 + M.X + M.dX)] #-144.5 already in S.X2?

确保在重新运行此代码之前删除dfmotion,因为如果重新运行并且dfmotion已经存在,循环将中断(或者更糟糕的是不会中断)。