gpt4 book ai didi

R plyr 应用于行

转载 作者:行者123 更新时间:2023-12-01 16:23:32 24 4
gpt4 key购买 nike

我有一个这样的数据框:

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

对于每个“站点”,我想除以“能量”[numcol wise],所以我会得到:

    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 包中的 ddply 以及该包的 numcolwise。但不知何故,我做错了 - 问题是挑选出“能量”成分。

有人知道怎么解决吗? [提前致谢...]

最佳答案

@seancarmody 的回答很酷。

这是另一种使用基本函数的方法:

# Select and join frames
mat.out<-merge(mat.in[grep("product", mat.in$var),], mat2 <- mat.in[mat.in$var=="energy",], "site")
# Calculate the quot values
mat.out$quot.2011=mat.out$year.2011.x/mat.out$year.2011.y
mat.out$quot.2012=mat.out$year.2012.x/mat.out$year.2012.y

# And if needs be you can remove the energy columns
mat.out[,-c(5,6,7)]

这里有一个使用 sqldf 的方法:

variable<-'p.site,p.var,p.year_2011,p.year_2012,
p.year_2011/e.year_2011 AS quot_2011,
p.year_2012/e.year_2012 AS quot_2012'
tables<- '(SELECT *
FROM `mat.in`
WHERE var LIKE \"product%\"
)
AS p,
(SELECT *
FROM `mat.in`
WHERE var LIKE \"energy\"
)
AS e'

fn$sqldf("SELECT $variable FROM $tables WHERE p.site=e.site")

这里是使用 data.table 的方法:

dt <- data.table(mat.in, key="site")
# Join
mat.out <- dt[var %like% "product"][dt[var=="energy"]]
# Calculate
mat.out <- mat.out[,quot.2011:=year.2011/year.2011.1]
mat.out <- mat.out[,quot.2012:=year.2012/year.2012.1]

从马修编辑:

在此基础上,使用 join inherited scope 稍微更高级(也更快)的 data.table 方式:

dt <- data.table(mat.in, key="site")
dt[dt[var=="energy"],quot.2011:=year.2011/i.year.2011]
dt[dt[var=="energy"],quot.2012:=year.2012/i.year.2012]

注意 i. 前缀告诉它从 i 而不是 x 获取变量。类似于 SQL 表名前缀。这避免了大的 merge 步骤; FAQ 1.12 中描述的技术。

j 中的多个 := 被实现时,会变成:

dt <- data.table(mat.in, key="site")
dt[dt[var=="energy"], { quot.2011:=year.2011/i.year.2011
quot.2012:=year.2012/i.year.2012 } ]

关于R plyr 应用于行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com