为了账号安全,请及时绑定邮箱和手机立即绑定

用于通过索引对矢量进行分区并对该分区执行操作的惯用R代码

用于通过索引对矢量进行分区并对该分区执行操作的惯用R代码

元芳怎么了 2019-08-28 09:20:42
用于通过索引对矢量进行分区并对该分区执行操作的惯用R代码我试图在R中找到惯用的方法来通过某个索引向量对数值向量进行分区,找到该分区中所有数字的总和,然后将每个单独的条目除以该分区总和。换句话说,如果我从这开始:df <- data.frame(x = c(1,2,3,4,5,6), index = c('a', 'a', 'b', 'b', 'c', 'c'))我希望输出创建一个向量(让我们称之为z):c(1/(1+2), 2/(1+2), 3/(3+4), 3/(3+4), 5/(5+6), 6/(5+6))如果我这样做是SQL并且可以使用窗口函数,我会这样做:select   x / sum(x) over (partition by index) as z  from df如果我使用plyr,我会做这样的事情:ddply(df, .(index), transform, z = x / sum(x))但我想知道如何使用标准的R函数编程工具,如mapply / aggregate等。
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

如果您只在单个向量上运行并且只需要一个索引向量,则tapply非常快


dat <- 1:6

lev <- rep(1:3, each = 2)

tapply(dat, lev, function(x){x/sum(x)})

#$`1`

#[1] 0.3333333 0.6666667

#

#$`2`

#[1] 0.4285714 0.5714286

#

#$`3`

#[1] 0.4545455 0.5454545

#

unlist(tapply(dat, lev, function(x){x/sum(x)}))

#       11        12        21        22        31        32 

#0.3333333 0.6666667 0.4285714 0.5714286 0.4545455 0.5454545 


查看完整回答
反对 回复 2019-08-28
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

其他三种方法:


dat <- 1:6

lev <- rep(1:3, each = 2)


lapply(split(dat, lev), function(x){x/sum(x)})

by(dat, lev, function(x){x/sum(x)})

aggregate(dat, list(lev), function(x){x/sum(x)})


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 464 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信