Как выбрать строки на основе 2 столбцов? - PullRequest
1 голос
/ 24 августа 2011
dx <- data.frame(CMPD = c("cmpd1","cmpd1","cmpd1","cmpd1","cmpd2","cmpd2",
                          "cmpd2","cmpd2","cmpd3","cmpd3","cmpd3","cmpd3"),
                 MRM = c("309.0/121.1","309.0/121.1","309.0/90.1",
                         "309.0/90.1","305.2/140.3","305.2/140.3","300.5/107.3",
                         "300.5/107.3","404.8/126.0","404.8/126.0","401.5/91.0",
                         "401.5/91.0"),
                 RESP = c(123.4,234.5,345.6,456.7,567.8,678.9,789.0,12.4,
                          23.5,34.6,45.7,56.8))

-

>dx

CMPD         MRM  RESP

1  cmpd1 309.0/121.1 123.4
2  cmpd1 309.0/121.1 234.5
3  cmpd1  309.0/90.1 345.6
4  cmpd1  309.0/90.1 456.7
5  cmpd2 305.2/140.3 567.8
6  cmpd2 305.2/140.3 678.9
7  cmpd2 300.5/107.3 789.0
8  cmpd2 300.5/107.3  12.4
9  cmpd3 404.8/126.0  23.5
10 cmpd3 404.8/126.0  34.6
11 cmpd3  401.5/91.0  45.7
12 cmpd3  401.5/91.0  56.8

Я хотел бы иметь возможность работать с этими данными на основе уникальности комбинации CMPD и MRM (например, строки 1, 2, затем строки3, 4 и т. Д.)

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Позвольте представить вам моего друга, пакет plyr.

Этот пакет позволяет легко использовать общую стратегию разделения, применения и объединения данных. Одной из наиболее полезных функций является ddply, которая принимает кадр данных в качестве входных данных и уменьшает кадр данных в качестве выходных данных. Вы указываете уникальные комбинации для разделения, а также функцию, которую хотите применить, а ddply делает все остальное.

Хорошим местом для изучения plyr является веб-сайт Хэдли или его статья в журнале статистического программного обеспечения . Есть также сотни ответов о plyr на StackOverflow. Просто следуйте тегу или тегу .

Вот несколько примеров:

library(plyr)

Чтобы извлечь среднее значение:

> ddply(dx, .(CMPD, MRM), numcolwise(mean))
   CMPD         MRM   RESP
1 cmpd1 309.0/121.1 178.95
2 cmpd1  309.0/90.1 401.15
3 cmpd2 300.5/107.3 400.70
4 cmpd2 305.2/140.3 623.35
5 cmpd3  401.5/91.0  51.25
6 cmpd3 404.8/126.0  29.05

или сумма:

> ddply(dx, .(CMPD, MRM), numcolwise(sum))
   CMPD         MRM   RESP
1 cmpd1 309.0/121.1  357.9
2 cmpd1  309.0/90.1  802.3
3 cmpd2 300.5/107.3  801.4
4 cmpd2 305.2/140.3 1246.7
5 cmpd3  401.5/91.0  102.5
6 cmpd3 404.8/126.0   58.1
2 голосов
/ 24 августа 2011

Вы можете использовать функцию by

by(dx$RESP, list(CMPD = dx$CMPD, MRM = dx$MRM), mean)

Возвращает объект by, с которым не всегда легко работать, но это возможно.

2 голосов
/ 24 августа 2011

Если вы хотите обработать целые подмножества фрейма данных, обычно нужно использовать ddply из пакета plyr:

ddply(dx, .(CMPD, MRM), .fun = doStuff)

Альтернативы ave или by и aggregate.Для конкретного примера вычисления отношения использование summarise может очень помочь:

ddply(dx, .(CMPD, MRM), .fun = summarise, ratio = RESP[1]/RESP[2])

Этот тип задачи обычно упоминается как «split-apply-объединение» в мире R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...