сравнить значения строк по нескольким строкам (R) - PullRequest
1 голос
/ 11 декабря 2011

Я не думаю, что этот вопрос еще задавался (большинство подобных вопросов касаются извлечения данных или возврата счета). Я новичок в R, поэтому любая помощь будет оценена!

У меня есть набор данных нескольких прогонов эксперимента в одном файле, и данные выглядят так, где у меня есть все временные шаги для каждого прогона в строках time [info] id (уникальный для каждого прогона)

Я пытаюсь рассчитать, когда система достигнет равновесия, которое я определяю как стабильные значения по 3 взаимозависимым параметрам. Я хотел бы сравнить содержимое строк и, если они находятся в пределах 5% друг от друга в течение 20 временных шагов, вернуть временной шаг, с которого начинается стабильность, и идентификатор.

Пока, я думаю, что это будет что-то вроде следующего (или, возможно, будет цикл 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 становится «стабильным» (то есть оно не изменяется более чем на 0,05 за X (здесь, 3) временных шагов), чтобы оно создаст следующие результаты:

    ID  timeToEQ
1   1   3
2   2   2

это помогает? Единственный способ сделать это - использовать цикл for, и я думаю, что должен быть более простым способом!

1 Ответ

2 голосов
/ 12 декабря 2011

Вот мой код. Я опубликую объяснение через некоторое время.

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 разбивает Data на подмножества на основе ID.
  2. diff(CC) вычисляет разницу между CC последовательных строк.
  3. abs(diff(CC)) < 0.05) возвращает TRUE, если разница стабилизировалась.
  4. Position находит первый экземпляр элемента, который удовлетворяет isTRUE.
...