我有一个这样的数据框:
mat.in=data.frame(site=c('A','A','A','B','B','B'),
var=c('product.A','product.B','energy','product.A','product.B','energy'),
year.2011=c(12,10,40,14,12,60),year.2012=c(13,11,45,25,13,65))
对于每个“站点”,我都想除以“能量”(按数字明智),因此我得到:
mat.out=data.frame(site=c('A','A','A','B','B','B'),
var=c('product.A','product.B','energy','product.A','product.B','energy'),
year.2011=c(12,10,40,14,12,60),year.2012=c(13,11,45,25,13,65),
quot.2011=c(0.30,0.25,1.00,0.23,0.20,1.00),quot.2012=c(0.29,0.24,1.00,0.38,0.20,1.00))
这将非常适合从包装plyr与该包装的编号组合使用。
但是我不知道怎么做-问题是挑选“能量”成分。
有人知道如何解决这个问题吗? [提前致谢...]
最佳答案
这将完成您的示例中的工作:
library(plyr)
ddply(mat.in, .(site), transform, quote.2011 = year.2011/year.2011[var=="energy"],
quote.2012 = year.2012/year.2012[var=="energy"])
为了更一般地执行此操作,我将首先对数据进行
melt
,以将year变成一个值而不是列名。这是使用
melt
的方式library(reshape2)
mat.m <- melt(mat.in, id.vars=1:2, variable.name="year")
mat.m$year <- sub("year.", "", mat.m$year)
mat.out <- ddply(mat.m, .(site, year), transform, quote = value/value[var=="energy"])
关于r - R plyr应用于行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12050629/