2013-03-17 15 views
0

Я хотел бы извлечь значение var2, которое соответствует минимальному значению var1 в каждой комбинации строительного месяца. Вот мой (подделка) набор данных:which.min в редакторе reshape2's dcast()?

head(mydata) 

# building month  var1  var2 
#1  A  1 -26.96333 376.9633 
#2  A  1 165.38759 317.3993 
#3  A  1 47.46345 271.0137 
#4  A  2 73.47784 294.8171 
#5  A  2 107.80130 371.7668 
#6  A  2 10.16384 308.7975 

Возпроизводимо код:

## create fake data set: 
set.seed(142) 
mydata1 = data.frame(building = rep(LETTERS[1:5],6),month = sort(rep(1:6,5)),var1=rnorm(30,50,35),var2 = runif(30,200,400)) 
mydata2 = data.frame(building = rep(LETTERS[1:5],6),month = sort(rep(1:6,5)),var1=rnorm(30,60,35),var2 = runif(30,150,400)) 
mydata3 = data.frame(building = rep(LETTERS[1:5],6),month = sort(rep(1:6,5)),var1=rnorm(30,40,35),var2 = runif(30,250,400)) 
mydata = rbind(mydata1,mydata2,mydata3) 
mydata = mydata[ order(mydata[,"building"], mydata[,"month"]), ] 
row.names(mydata) = 1:nrow(mydata) 

## here is how I pull the minimum value of v1 for each building-month combination: 
require(reshape2) 
m1 = melt(mydata, id.var=1:2) 
d1 = dcast(m1, building ~ month, function(x) min(max(x,0), na.rm=T), 
      subset = .(variable == "var1")) 

Это вытаскивает минимальное значение var1 для каждого здания месяца комбо ...

head(d1) 

# building   1   2  3   4   5   6 
#1  A 165.38759 107.80130 93.32816 73.23279 98.55546 107.58780 
#2  B 92.08704 98.94959 57.79610 94.10530 80.86883 99.75983 
#3  C 93.38284 100.13564 52.26178 62.37837 91.98839 97.44797 
#4  D 82.43440 72.43868 66.83636 105.46263 133.02281 94.56457 
#5  E 70.09756 61.44406 30.78444 68.24334 94.35605 61.60610 

Однако , то, что я хочу, это кадр данных, настроенный точно как d1, который вместо этого показывает значение var2, которое соответствует минимальному значению, выведенному для var1 (показано в d1 выше). Моя кишка говорит мне, что это должен быть вариант на which.min(), но не получил это для работы с dcast() или ddply(). Любая помощь приветствуется!

ответ

3

Это может быть возможно в один шаг, но я больше знаком с plyr чем reshape2,

dcast(ddply(mydata, .(building, month), summarize, value = var2[which.min(var1)]), 
     building ~ month) 
+0

Почему вам нужно 'dcast' здесь? – Roland

+0

переформатировать из длинного в широкий – baptiste

+0

в порядке. для меня не очевидно, что это требуется в вопросе. – Roland