Различающиеся подсписки фрейма данных - PullRequest
3 голосов
/ 03 декабря 2011

У меня есть фрейм данных, который содержит несколько чередующихся значений, которые произошли на временной шкале. Я хотел бы создать новый фрейм данных, который содержит номера строк (в основном идентификаторы строк), дескриптор файла, операцию и значение «size».

Пример:

  line fd syscall       size
1    1  1   lseek 1289020416
2    2  1   lseek 1289021440
3    3  2   lseek 1289024512
4    4  1   lseek 1289025536
5    5  2   lseek 1289026560
6    6  1   lseek 1289027584

Я бы хотел вычислить разность значений размера на единицу измерения и показать начальную точку различий. Функция diff сама выбрасывает много данных. Есть ли что-то подобное, что поможет мне иметь контекст (например, где было начало каждой строки)?

Мне бы хотелось, чтобы результаты выглядели следующим образом: я знаю, как далеко продвинулся каждый fd с предыдущей строки, и какова была предыдущая строка.

  line fd diff
1    1  1 1024
2    2  1 4096
3    3  2 2048
4    4  1 2048

Есть ли что-то, что я могу сделать, это проще, чем разорвать все на части и зациклить? Я должен верить, что у кого-то немного лучше diff.

Пример ввода:

structure(list(line = 1:6, fd = c(1, 1, 2, 1, 2, 1), syscall = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), class = "factor", .Label = "lseek"), size = c(1289020416, 
1289021440, 1289024512, 1289025536, 1289026560, 1289027584)), .Names = c("line", 
"fd", "syscall", "size"), row.names = c(NA, -6L), class = "data.frame")

1 Ответ

3 голосов
/ 03 декабря 2011

Используйте plyr, чтобы разрезать data.frame на части и преобразовать, чтобы присоединить новый вектор.

library(plyr)
ddply(dtf, .(fd), function(x) transform(x, diff = c(x$size[1], diff(x$size))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...