比较多行的行值 (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
编辑。下面是它的工作原理。
ddply
将 Data
分解为基于 ID
的子集。
diff(CC)
计算连续行的CC
之间的差异。
如果差异稳定,abs(diff(CC)) < 0.05)
返回 TRUE。
Position
定位满足 isTRUE
的元素的第一个实例。
【讨论】:
感谢您的回复!有没有办法继续比较,以确保数据在给定时间内稳定?我认为我可以通过两种方式做到这一点,要么通过使允许的差异小到不可能使值必须非常稳定,要么找到一种方法(rollapply?)以确保在 X 个周期内差异保持很小。 您可以通过将abs(diff(CC)) < 0.05
替换为封装stability
逻辑的适当函数来做到这一点。如果您决定采用不可能很小的差异,那么您只需将 0.05 更改为您认为合理的 epsilon 值。希望这会有所帮助。
好的,我想我已经接近了......你能帮我弄清楚如何更好地做到这一点,这就是我所拥有的,但我想做一些循环或其他东西来扩展它.我试着把它写成一个函数,但完全失败了。 ddply(Data, .(ID), summarize, timeToEQ = Position(isTRUE, (abs(diff(CC, lag=1)) < 0.05 & abs(diff(CC, lag=2)) < 0.05 & abs(diff(CC, lag=3)) < 0.05)))
你能用语言描述你想要做什么的逻辑吗?
我想要做的是要求差异小于某个值(比如 0.05)持续一段时间(可能是三个周期)。在下面的序列中,如果只比较直接邻居,那么我们将得到与上面相同的结果。如果我们要求连续三个时期保持稳定,那么这部分就不会变得稳定。 0.99 0.80 0.90 0.91 0.92 0.97 0.92
以上是关于比较多行的行值 (R)的主要内容,如果未能解决你的问题,请参考以下文章