我有一个这样的数据框:

    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/

10-12 19:45