我想按组计算一堆变量的加权均值,因此与colwise一起ddply似乎是一个合理的选择。我的代码是:
library(plyr)
j.parms.by.meas <- ddply(j.subgroups,
.(measure),
colwise(weighted.mean,
.(ee.eer, ee.iplv, sf.per.tstat, kwh.per.sf,
ee.kw.per.sf, ee.kwh.per.sf, efficiency,
motor.eff, ee.lpd, inc.cost),
j.subgroups$unit.qty))
但是,出现以下错误:
Error in weighted.mean.default(X[[1L]], ...) :
'x' and 'w' must have the same length
看来我正在将unit.qty的整个向量传递给加权均值函数,而不是按照我的意图将unit.qty的向量传递给分组变量的子集。有没有简单的方法可以将ddply产生的子集向量作为参数传递给ddply中的指定函数?
以下是一些示例数据-请注意,并非所有变量均应填充所有var:
measure ee.eer ee.iplv sf.per.tstat kwh.per.sf ee.kw.per.sf ee.kwh.per.sf efficiency motor.eff ee.lpd inc.cost unit.qty
9813 High Performance Glazing NA NA NA NA 0.0004788 1.634573 NA NA NA 3.177014 817.00
9814 High Performance Glazing NA NA NA NA 0.0016200 6.031441 NA NA NA 0.889816 5051.00
9815 High Performance Glazing NA NA NA NA 0.0011559 4.607375 NA NA NA 1.502042 836.00
9816 High Performance Glazing NA NA NA NA 0.0006050 2.286861 NA NA NA 1.041064 4027.00
9817 High Performance Glazing NA NA NA NA 0.0008772 3.574747 NA NA NA 2.436068 173610.00
9818 High Performance Glazing NA NA NA NA 0.0010797 4.288593 NA NA NA 1.373322 5328.00
9819 High Performance Glazing NA NA NA NA 0.0010797 4.288593 NA NA NA 1.373322 5668.00
9820 High Performance Glazing NA NA NA NA 0.0010797 4.288593 NA NA NA 1.373322 150.00
9821 High Performance Glazing NA NA NA NA 0.0012480 4.887974 NA NA NA 1.190700 33735.40
9822 High Performance Glazing NA NA NA NA 0.0014988 6.041895 NA NA NA 2.081282 3879.50
9823 High Performance Glazing NA NA NA NA 0.0012100 4.736534 NA NA NA 1.126340 69.70
9824 High Performance Glazing NA NA NA NA 0.0010308 4.307727 NA NA NA 2.693508 1356.03
9825 High Performance Glazing NA NA NA NA 0.0009654 3.810419 NA NA NA 1.180242 1832.00
9826 High Performance Glazing NA NA NA NA 0.0009654 3.810419 NA NA NA 1.180242 2748.00
9827 High Performance Glazing NA NA NA NA 0.0011123 4.275836 NA NA NA 0.493198 1722.90
9828 High Performance Glazing NA NA NA NA 0.0008511 3.332246 NA NA NA 0.987162 1850.00
9829 High Performance Glazing NA NA NA NA 0.0011237 4.651937 NA NA NA 2.382166 224.00
9830 High Performance Glazing NA NA NA NA 0.0010797 4.288593 NA NA NA 1.373322 819.00
9831 High Performance Glazing NA NA NA NA 0.0014532 6.323424 NA NA NA 3.401468 3934.00
9832 High Performance Glazing NA NA NA NA 0.0011559 4.607375 NA NA NA 1.502042 9351.00
10329 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 900.00
10330 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 1246.00
10331 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 265.00
10332 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 308.00
10333 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 500.00
10334 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 335.00
10335 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 550.00
10336 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 433.00
10337 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 676.00
10338 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 800.00
10339 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 350.00
10340 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 750.00
10341 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 200.00
10342 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 1200.00
10343 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 600.00
10344 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 433.00
10345 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 500.00
10346 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 600.00
10347 >150 HP NA NA NA NA NA NA NaN 0.9496114 NA 117.631768 4988.00
10348 >150 HP NA NA NA NA NA NA 0.95 0.9500000 NA 117.631768 250.00
这是来自相同数据的dump的转储:
structure(list(measure = structure(c(122L, 122L, 122L, 122L,
122L, 122L, 122L, 122L, 122L, 122L, 122L, 122L, 122L, 122L, 122L,
122L, 122L, 122L, 122L, 122L, 124L, 124L, 124L, 124L, 124L, 124L,
124L, 124L, 124L, 124L, 124L, 124L, 124L, 124L, 124L, 124L, 124L,
124L, 124L, 124L), .Label = c("(2) 4-lamp 4ft T5HO replacing 1000W MH",
"(2) 6-lamp 4ft T8 replacing 1000W MH", "2-foot lamp", "2-lamp 4ft T5HO replacing 150W HPS",
"2-lamp 4ft T5HO replacing 150W MH", "2-lamp 4ft T5HO replacing 175W HPS",
"2-lamp 4ft T5HO replacing 175W MH", "2-lamp 4ft T8 replacing 150W HPS",
"2-lamp 4ft T8 replacing 175W HPS", "2-lamp 4ft T8 replacing 175W MH",
"3-foot lamp", "3-lamp 4ft T5HO replacing 250W HPS", "3-lamp 4ft T5HO replacing 250W MH",
"4-foot lamp", "4-lamp 4ft T5HO replacing 400W HPS", "4-lamp 4ft T5HO replacing 400W MH",
"4-lamp 4ft T8 replacing 250W HPS", "4-lamp 4ft T8 replacing 250W MH",
"6-lamp 4ft T5HO replacing 400W HPS", "6-lamp 4ft T5HO replacing 400W MH",
"6-lamp 4ft T5HO replacing 750W MH", "6-lamp 4ft T8 replacing 400W HPS",
"6-lamp 4ft T8 replacing 400W MH", "8-foot lamp", "Automotive Facility",
"Cold Cathode Fluorecent Lamps 3 w", "Cold Cathode Fluorecent Lamps 5 w",
"Cold Cathode Fluorecent Lamps 8 w", "Compact flourescent Lamps 13 w Hardwired",
"Compact flourescent Lamps 14 w Hardwired", "Compact flourescent Lamps 14 w Screw-In",
"Compact flourescent Lamps 15 w Screw-In", "Compact flourescent Lamps 18 w Hardwired",
"Compact flourescent Lamps 18 w Screw-In", "Compact flourescent Lamps 20 w Screw-In",
"Compact flourescent Lamps 23 w Hardwired", "Compact flourescent Lamps 23 w Screw-In",
"Compact flourescent Lamps 26 w Hardwired", "Compact flourescent Lamps 26 w Screw-In",
"Compact flourescent Lamps 27 w Hardwired", "Compact flourescent Lamps 27 w Screw-In",
"Compact flourescent Lamps 32 w Hardwired", "Compact flourescent Lamps 7 w Hardwired",
"Compact flourescent Lamps 7 w Screw-In", "Compact flourescent Lamps 84 w Hardwired",
"Court House", "Daylighting Controls", "Dining: Bar Lounge/Leisure",
"Dining: Cafeteria/Fast Food", "Dining: Family", "Dormitory",
"Exercise Center", "Exit Signs (Electroluminescent replaceing inc.)",
"Exit Signs (Electroluminescent replacing CFLs)", "Exit Signs (LED replacing CFL)",
"Exit Signs (LED replacing incandescent)", "Health Care Clinic",
"Hospital", "Hotel", "Induction Lighting replacing >=100W and <=200W HPS",
"Induction Lighting replacing >=70W and <=200W MH", "Induction Lighting replacing >200W and <=250W MH",
"Induction Lighting replacing >200W and <=400W HPS", "LED Channel Lights",
"LED traffic lights - Green 12\" - 120V", "LED traffic lights - Green 12\" - 12V",
"LED traffic lights - Green 8\" - 120V", "LED traffic lights - Green 8\" - 12V",
"LED traffic lights - Red 12\" - 120V", "LED traffic lights - Red 8\" - 120V",
"Library", "Manufacturing Facility", "Museum", "Occupancy Sensors",
"Office", "Parking Garage", "Performing Arts Theater", "Police/Fire Station",
"Retail (Other Than Mall)", "School/University", "Specialty CFL 14 w Screw-In",
"Specialty CFL 15 w Screw-In", "Specialty CFL 18 w Screw-In",
"Specialty CFL 23 w Screw-In", "Specialty CFL 27 w Screw-In",
"Specialty CFL 7 w Screw-In", "Warehouse", "Workshop", "(2) 4-lamp 4ft T5HO replacing 750W MH",
"2-lamp 4ft T8 replacing 150W MH", "3-lamp 4ft T8 replacing 250W MH",
"4-lamp 2ft T5HO replacing 150W MH", "LED Lamps NO Reflector",
"LED Lamps W/ Reflector", "MR-16 LED Lamps", "Pedestrian W/ countdown",
"Refrigerated Case LED Lamps NO motion Sensors", "Refrigerated Case LED Lamps W/ motion Sensors",
"Religious Building", "< 150 Tons", "<= 65 kBtu/h", "> 12 kBtu/h",
"> 7 and <= 9 kBtu/h", "> 9 and <= 12 kBtu/h", ">= 135 and < 240 kBtu/h",
">= 150 Tons", ">= 150 Tons and < 300 Tons", ">= 240 kBtu/h",
">= 300 Tons", ">= 65 and < 135 kBtu/h", "Advanced Diagnostic Tune Up (ADTU) 11-19.9 tons",
"Advanced Diagnostic Tune Up (ADTU) 20-25 tons", "Advanced Diagnostic Tune Up (ADTU) 4-6 tons",
"Advanced Diagnostic Tune Up (ADTU) 6-10.9 tons", "Outside Air Economizers",
"Phase I", "Phase II - Duct Seal", "Programmable Thermostat",
"Duct Test and Repair (DTR) 11-19.9 tons", "Duct Test and Repair (DTR) 2-6 tons",
"Duct Test and Repair (DTR) 6-10.9 tons", "High Performance Glazing",
"Shade Screen", ">150 HP", "1 HP", "1.5 HP", "10 HP", "100 HP",
"125 HP", "15 HP", "150 HP", "2 HP", "20 HP", "25 HP", "3 HP",
"30 HP", "40 HP", "5 HP", "50 HP", "60 HP", "7.5 HP", "75 HP",
"Anti-Sweat Heater Controls", "Beverage Machine Controls", "HiE Compressor - Walk In Cooler",
"HiE Ice Makers - Air-Cooled - 1001 to 1500lbs", "HiE Ice Makers - Air-Cooled - 101 to 200lbs",
"HiE Ice Makers - Air-Cooled - 201 to 300lbs", "HiE Ice Makers - Air-Cooled - 301 to 400lbs",
"HiE Ice Makers - Air-Cooled - 401 to 500lbs", "HiE Ice Makers - Air-Cooled - 501 to 1000lbs",
"HiE Ice Makers - Water-Cooled - 1001 to 2000lbs", "HiE Ice Makers - Water-Cooled - 101 to 200lbs",
"HiE Ice Makers - Water-Cooled - 401 to 500lbs", "HiE Ice Makers - Water-Cooled - 501 to 1000lbs",
"High-Efficiency Evaporator Fan Motors (EC)", "High-Efficiency Evaporator Fan Motors (PSC)",
"High-Efficiency Freezer (1 Door)", "High-Efficiency Freezer (2 Door)",
"High-Efficiency Freezer (3 Door)", "High-Efficiency Refrigerator (1 Door)",
"High-Efficiency Refrigerator (2 Door)", "High-Efficiency Refrigerator (3 Door)",
"Night Covers", "Snack Machine Controls", "Strip Curtains on Walk-Ins",
"Computer Power Management - Desktop", "Floating Head Controls",
"HiE Condenser", "Reach-in Cooler Controls", "CO Sensor / on-off / Office",
"CO Sensor / VAV / Office", "K-12 School", "Retail", "Dual Technology",
"Electric or Pneumatic T-Stat", "Existing EMS System", "Integrated Lighting Control",
"Misc"), class = "factor"), ee.eer = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), ee.iplv = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), sf.per.tstat = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), kwh.per.sf = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), ee.kw.per.sf = c(0.0004788, 0.00162, 0.0011559,
0.000605, 0.0008772, 0.0010797, 0.0010797, 0.0010797, 0.001248,
0.0014988, 0.00121, 0.0010308, 0.0009654, 0.0009654, 0.0011123,
0.0008511, 0.0011237, 0.0010797, 0.0014532, 0.0011559, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA), ee.kwh.per.sf = c(1.63457252, 6.0314408, 4.60737506,
2.2868612, 3.57474668, 4.28859278, 4.28859278, 4.28859278, 4.8879738,
6.04189532, 4.736534, 4.30772732, 3.81041936, 3.81041936, 4.27583642,
3.33224594, 4.65193678, 4.28859278, 6.32342408, 4.60737506, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA), efficiency = c(NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NaN, 0.95, NaN, NaN,
NaN, NaN, NaN, 0.95, NaN, NaN, 0.95, NaN, NaN, 0.95, NaN, 0.95,
0.95, NaN, NaN, 0.95), motor.eff = c(NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.949611437971035,
0.95, 0.949611437971035, 0.949611437971035, 0.949611437971035,
0.949611437971035, 0.949611437971035, 0.95, 0.949611437971035,
0.949611437971035, 0.95, 0.949611437971035, 0.949611437971035,
0.95, 0.949611437971035, 0.95, 0.95, 0.949611437971035, 0.949611437971035,
0.95), ee.lpd = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
), inc.cost = c(3.177014, 0.889816, 1.502042, 1.041064, 2.436068,
1.373322, 1.373322, 1.373322, 1.1907, 2.081282, 1.12634, 2.693508,
1.180242, 1.180242, 0.493198, 0.987162, 2.382166, 1.373322, 3.401468,
1.502042, 117.631768103245, 117.631768103245, 117.631768103245,
117.631768103245, 117.631768103245, 117.631768103245, 117.631768103245,
117.631768103245, 117.631768103245, 117.631768103245, 117.631768103245,
117.631768103245, 117.631768103245, 117.631768103245, 117.631768103245,
117.631768103245, 117.631768103245, 117.631768103245, 117.631768103245,
117.631768103245), unit.qty = c(817, 5051, 836, 4027, 173610,
5328, 5668, 150, 33735.4, 3879.5, 69.7, 1356.03, 1832, 2748,
1722.9, 1850, 224, 819, 3934, 9351, 900, 1246, 265, 308, 500,
335, 550, 433, 676, 800, 350, 750, 200, 1200, 600, 433, 500,
600, 4988, 250)), .Names = c("measure", "ee.eer", "ee.iplv",
"sf.per.tstat", "kwh.per.sf", "ee.kw.per.sf", "ee.kwh.per.sf",
"efficiency", "motor.eff", "ee.lpd", "inc.cost", "unit.qty"), row.names = c(9813L,
9814L, 9815L, 9816L, 9817L, 9818L, 9819L, 9820L, 9821L, 9822L,
9823L, 9824L, 9825L, 9826L, 9827L, 9828L, 9829L, 9830L, 9831L,
9832L, 10329L, 10330L, 10331L, 10332L, 10333L, 10334L, 10335L,
10336L, 10337L, 10338L, 10339L, 10340L, 10341L, 10342L, 10343L,
10344L, 10345L, 10346L, 10347L, 10348L), class = "data.frame")
这是我的最终代码,基于Didzis Elferts的回答。感谢您的输入!
j.parms.by.meas <- ddply(j.subgroups,
.(measure),
function(x) {
apply(x[c('ee.eer', 'ee.iplv', 'sf.per.tstat',
'kwh.per.sf', 'ee.kw.per.sf',
'efficiency', 'motor.eff', 'ee.lpd',
'inc.cost')],
2,weighted.mean, x$unit.qty, na.rm=T)
})
最佳答案
一种解决方案是将colwise()
替换为apply()
函数。在这种情况下,将数据除以变量measure
,然后将函数应用于每个子样本。这里x
只是子样本之一,现在x$unit.qty
可以使用了。还添加了na.rm=TRUE
,因为您具有NA
值,但是可以将其删除。
ddply(j.subgroups,
.(measure),function(x)
apply(x[,2:11],2,weighted.mean,x$unit.qty,na.rm=TRUE))
measure ee.eer ee.iplv sf.per.tstat kwh.per.sf ee.kw.per.sf ee.kwh.per.sf
1 High Performance Glazing NaN NaN NaN NaN 0.000977688 3.934811
2 >150 HP NaN NaN NaN NaN NaN NaN
efficiency motor.eff ee.lpd inc.cost
1 NaN NaN NaN 2.100755
2 0.95 0.9497194 NaN 117.631768
关于r - ddply和colwise-将其他列作为参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15006064/