R выбор повторяющихся строк - PullRequest
3 голосов
/ 03 апреля 2010

Хорошо, я довольно новичок в R, и я попытался найти в документации то, что мне нужно сделать, но здесь проблема.

У меня есть data.frame с именем heeds.data в следующей форме (некоторые столбцы для простоты опущены) eval.num, eval.count, ... fitness, fitness.mean, green.h.0, green.v.0, offset.0, green.h.1, green.v.1, ... зеленый. h.7, green.v.7, offset.7 ...

И я выбрал строку, отвечающую следующим критериям:

best.fitness <- min(heeds.data$fitness.mean[heeds.data$eval.count >= 10])
best.row <- heeds.data[heeds.data$fitness.mean == best.fitness]

Теперь мне нужны все остальные строки, столбцы которых имеют значения от green.h.0 до offset.7 (непрерывный участок столбцов), равные best.row

Я думал, что это может сработать

heeds.best <- heeds.data$fitness[
  heeds.data$green.h.0 == best.row$green.h.0 & ...
]

Но с 24 столбцами это выглядит как глупый метод. Ищете что-то немного проще с меньшим количеством ручного ввода.

Вот краткий пример данных, чтобы показать, что я хочу

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0
1         1           1500     1500          100        120        40
2         2           1000     1250          100        120        40
3         3           1250     1250          100        120        40
4         4           1000     1187.5        100        120        40
5         1           2000     2000          200        100        40
6         1           3000     3000          150        90         10
7         1           2000     2000          90         90         100
8         2           1800     1900          90         90         100

Следует выбрать "лучший" в качестве строки 4 Тогда я хочу получить результаты следующим образом

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0
1         1           1500     1500          100        120        40
2         2           1000     1250          100        120        40
3         3           1250     1250          100        120        40
4         4           1000     1187.5        100        120        40

Данные на самом деле не отсортированы, и есть еще много столбцов, но это концепция

Спасибо!

1 Ответ

4 голосов
/ 03 апреля 2010

Ваш вопрос по сути просто сложный вопрос индексации. У меня есть решение здесь, хотя могут быть и более простые. Я загрузил ваши примеры данных в DF:

Во-первых, это дает нам лучший индекс строки (легко использовать which.min()):

R> bind <- which.min(DF[,"fitness.mean"])  # index of best row

Далее, мы apply() проводим сравнение по строкам (по подмножеству столбцов, о которых мы заботимся, здесь индексируем просто по позициям 5-7).

Мы используем функцию сравнения cmpfun, чтобы сравнить текущую строку r с лучшей строкой (проиндексированной bind), и используем all(), чтобы получить строки, в которых все элементы соответствуют. [Нам нужно drop=FALSE здесь, чтобы сделать его сопоставимым с обеих сторон, иначе as.numeric() поможет. ]

R> cmpfun <- function(r) all(r == DF[bind,5:7,drop=FALSE])  # compare to row bind

Это мы просто apply по строкам:

R> brows <- apply(DF[,5:7], 1, cmpfun)

И вот строки, которые мы хотели:

R> DF[brows, ]
  eval.num eval.count fitness fitness.mean green.h.0 green.v.0 offset.0
1        1          1    1500         1500       100       120       40
2        2          2    1000         1250       100       120       40
3        3          3    1250         1250       100       120       40
4        4          4    1000         1188       100       120       40
R> 

Не имеет значения, что мы используем три столбца для сравнения - все, что имело значение, это то, что у нас было индексное выражение (здесь 5:7) для нужных столбцов.

...