Изменение формы данных и логическая индексация в R - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть следующие (фиктивные) данные:

d <- structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 5L, 
5L, 5L, 5L, 5L, 5L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
2L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("apple", "grapefruit", 
"orange", "peach", "pear"), class = "factor"), type = structure(c(2L, 
2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("large", 
"small"), class = "factor"), location = structure(c(1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("P1", 
"P2", "P3"), class = "factor"), diameter = c(17.2, 19.1, 18.5, 
23.3, 22.9, 19.4, 11.1, 11.8, 6.8, 3.2, 7.9, 5.6, 8.4, 9.2, 9.7, 
17.1, 19.4, 18.9, 11.8, 10.6, 10.1, 18.8, 17.9, 13.2, 8.5, 8.9, 
7.2, 10.1, 8.7, 6.6)), .Names = c("group", "type", "location", 
"diameter"), class = "data.frame", row.names = c(NA, -30L))

Я хотел бы создать из этого новый фрейм данных, получая соотношения из переменной «диаметра» для каждого уровня из 3 факторов: «location "," type "и" group ".

P3.P1.L <- with(d, diameter[group=="pear" & type=="large" & location=="P3"] / diameter[group=="pear" & type=="large" & location=="P1"] )
P2.P1.L <- with(d, diameter[group=="pear" & type=="large" & location=="P2"] / diameter[group=="pear" & type=="large" & location=="P1"] )
P3.P1.S <- with(d, diameter[group=="pear" & type=="small" & location=="P3"] / diameter[group=="pear" & type=="small" & location=="P1"] )
P2.P1.S <- with(d, diameter[group=="pear" & type=="small" & location=="P2"] / diameter[group=="pear" & type=="small" & location=="P1"] )

Конечный data.frame будет выглядеть примерно так:

group, type, P2.P1, P3.P1
pear, large, 1.75, 2.469
pear, small, 0.613, 1.063
apple, large, ..., ...
apple, small, ..., ...

Очевидно, я мог бы сделать это так, как я 'Как показано выше - логическая индексация правильных уровней трех факторов в каждом случае.Проблема в том, что в моих реальных данных у меня есть около 40 уровней в «групповом» факторе (хотя все еще только 2 в «типе»).Мне бы хотелось решение, которое позволит мне использовать логическое индексирование с «местоположением» и, возможно, «типом», а затем перебирать все уровни «группы».Например, что-то вроде:

with(d, by(d, group, function(x) diameter[type=="large" & location=="P3"] / diameter[type=="large" & location=="P1"]) )

Но это не совсем то, что я хотел (и индексация с помощью «group == x» тоже не работает).

Решение, которое отслеживает связь каждого отношения с его уровнями факторов «группа» и «тип», а затем помещает их в новый фрейм данных, как показано в желаемом выводе выше, было бы впечатляющим,Будем весьма благодарны за любые предложения о том, как подойти к этому вопросу.

1 Ответ

2 голосов
/ 16 февраля 2012

Вы можете использовать dcast для преобразования данных в более широкий формат.

library(reshape2)
d <- dcast( d, group + type ~ location )

Тогда вычислить нужные коэффициенты просто, например:

transform( d, P2.P1=P2/P1, P3.P1=P3/P1 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...