which.min within reshape2's dcast()?

萝らか妹 提交于 2021-01-29 08:31:47

问题


I would like to extract the value of var2 that corresponds to the minimum value of var1 in each building-month combination. Here's my (fake) data set:

 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

Reproducible code:

## 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"))

This pulls out the minimum value of var1 for each building-month combo...

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

However, what I want is a data frame set up exactly as d1 that instead shows the value of var2 that corresponds to the minimum value pulled for var1 (shown in d1 above). My gut tells me it should be a variation on which.min(), but haven't gotten this to work with dcast() or ddply(). Any help is appreciated!


回答1:


It may be possible in one step, but I'm more familiar with plyr than reshape2,

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


来源:https://stackoverflow.com/questions/15464544/which-min-within-reshape2s-dcast

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!