У меня есть следующие (фиктивные) данные:
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» тоже не работает).
Решение, которое отслеживает связь каждого отношения с его уровнями факторов «группа» и «тип», а затем помещает их в новый фрейм данных, как показано в желаемом выводе выше, было бы впечатляющим,Будем весьма благодарны за любые предложения о том, как подойти к этому вопросу.