比较多行的行值 (R)

Posted

技术标签:

【中文标题】比较多行的行值 (R)【英文标题】:compare row values over multiple rows (R) 【发布时间】:2012-01-18 00:19:15 【问题描述】:

我认为这个问题尚未提出(大多数类似的问题是关于提取数据或返回计数)。我是 R 新手,因此我们将不胜感激!

我在一个文件中有一个实验多次运行的数据集,数据看起来像这样,其中我有每个运行的所有时间步长 time [info] id(每次运行唯一)

我试图计算系统何时达到平衡,我将其定义为 3 个相互依赖的参数中的稳定值。我想比较行的内容,如果它们在 20 个时间步长内彼此相差 5%,则返回稳定性开始的时间步长和 id。

到目前为止,我认为它将类似于以下内容(或者可能有一个 while 循环)(抱歉格式错误):

y=1;
z=0; #variables to control the loop
x=0;
for (ID) 
    if (CC at time=x == 0.05+-CC at time=y ) 

       if(z<=20) #catalogs the number of periods that match
           y++ 
           z++

      else [save value in column]

   

else #no match for sustained period so start over again
     x++
     y=x+1
     z=0
   

eta:CC 是我感兴趣的参数之一,范围在 0 和 1 之间,尽管端点不太可能。

这是一个可能有帮助的简单示例:这类似于我的数据的外观:

zz <- textConnection("time CC ID 
1          0.99       1
2          0.80       1
3          0.90       1
4          0.91       1
5          0.92       1
6          0.91       1
1          0.99       2
2          0.90       2
3          0.90       2
4          0.91       2
5          0.92       2
6          0.91       2")
Data <- read.table(zz, header = TRUE)
close(zz)

我的问题是,我怎样才能通过这些线找出 CC 的值何时变得“稳定”(意味着它在 X(这里,3)时间步长上的变化不超过 0.05),以便它将产生以下结果:

    ID  timeToEQ
1   1   3
2   2   2

这有帮助吗?我能想到的唯一方法是使用 for 循环,我认为 必须 是一种更简单的方法!

【问题讨论】:

参数是否有可能为 0(这会使 5% 以内的要求相当严格)? 有一个非零的机会,但不太可能。我玩弄了 eq 的不同定义,但在我弄清楚如何计算它之前,我被卡住了 也许您可以包含一个可重现的小示例 (***.com/questions/5963269/…) 并向我们展示您目前的成果? 我添加了更多解释,希望对您有所帮助。谢谢你的链接——这是我第一次在这里发帖。 你看过zoo包里的rollapply了吗? 【参考方案1】:

这是我的代码。过段时间我会发解释的。

require(plyr)
ddply(Data, .(ID), summarize, timeToEQ = Position(isTRUE, abs(diff(CC)) < 0.05 ))

  ID timeToEQ
1  1        3
2  2        2

编辑。下面是它的工作原理。

    ddplyData 分解为基于 ID 的子集。 diff(CC) 计算连续行的CC 之间的差异。 如果差异稳定,abs(diff(CC)) &lt; 0.05) 返回 TRUE。 Position 定位满足 isTRUE 的元素的第一个实例。

【讨论】:

感谢您的回复!有没有办法继续比较,以确保数据在给定时间内稳定?我认为我可以通过两种方式做到这一点,要么通过使允许的差异小到不可能使值必须非常稳定,要么找到一种方法(rollapply?)以确保在 X 个周期内差异保持很小。 您可以通过将abs(diff(CC)) &lt; 0.05 替换为封装stability 逻辑的适当函数来做到这一点。如果您决定采用不可能很小的差异,那么您只需将 0.05 更改为您认为合理的 epsilon 值。希望这会有所帮助。 好的,我想我已经接近了......你能帮我弄清楚如何更好地做到这一点,这就是我所拥有的,但我想做一些循环或其他东西来扩展它.我试着把它写成一个函数,但完全失败了。 ddply(Data, .(ID), summarize, timeToEQ = Position(isTRUE, (abs(diff(CC, lag=1)) &lt; 0.05 &amp; abs(diff(CC, lag=2)) &lt; 0.05 &amp; abs(diff(CC, lag=3)) &lt; 0.05))) 你能用语言描述你想要做什么的逻辑吗? 我想要做的是要求差异小于某个值(比如 0.05)持续一段时间(可能是三个周期)。在下面的序列中,如果只比较直接邻居,那么我们将得到与上面相同的结果。如果我们要求连续三个时期保持稳定,那么这部分就不会变得稳定。 0.99 0.80 0.90 0.91 0.92 0.97 0.92

以上是关于比较多行的行值 (R)的主要内容,如果未能解决你的问题,请参考以下文章

将谷歌电子表格行值转换为不同工作表中的列

pycharm怎么多行选择一起注释

如何在 SQL Server 中插入多行?

比较oracle中的行值

如何用R将列中相同值的行值分组? [复制]

比较熊猫数据框中的行值