比较多行的行值(R)

时间:2011-12-11 19:54:05

标签: r dataframe matching

我认为这个问题还没有提出(大多数类似的问题都是关于提取数据或返回计数)。我是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循环,我认为必须是一种更简单的方法!

1 个答案:

答案 0 :(得分:2)

这是我的代码。我会在一段时间内发布解释。

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

  ID timeToEQ
1  1        3
2  2        2

EDIT。下面是它的工作原理。

  1. ddply根据DataID分成子集。
  2. diff(CC)计算连续行CC之间的差异。
  3. 如果差异已经稳定,
  4. abs(diff(CC)) < 0.05)将返回TRUE。
  5. Position找到满足isTRUE
  6. 的元素的第一个实例