我认为这个问题还没有提出(大多数类似的问题都是关于提取数据或返回计数)。我是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 :(得分:2)
这是我的代码。我会在一段时间内发布解释。
require(plyr)
ddply(Data, .(ID), summarize, timeToEQ = Position(isTRUE, abs(diff(CC)) < 0.05 ))
ID timeToEQ
1 1 3
2 2 2
EDIT。下面是它的工作原理。
ddply
根据Data
将ID
分成子集。 diff(CC)
计算连续行CC
之间的差异。abs(diff(CC)) < 0.05)
将返回TRUE。Position
找到满足isTRUE
。