R语言 将每个值除以各组值的总和

vyu0f0g1  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(396)

我有以下数据框,其中“x”是分组变量,“y”是一些值:

dat <- data.frame(x = c(1, 2, 3, 3, 2, 1), y = c(3, 4, 4, 5, 2, 5))

我想创建一个新列,其中每个“y”值除以由“x”定义的每个组中“y”的总和。例如,第一行的结果是3 /(3 + 5)= 0. 375,其中分母是组1(x = 1)中“y”值的总和。

3wabscal

3wabscal1#

解决这个问题的方法有很多,这里有一个

with(dat, ave(y, x, FUN = function(x) x/sum(x)))
## [1] 0.3750000 0.6666667 0.4444444 0.5555556 0.3333333 0.6250000

还有一种可能

library(data.table)
setDT(dat)[, z := y/sum(y), by = x]
dat
#    x y         z
# 1: 1 3 0.3750000
# 2: 2 4 0.6666667
# 3: 3 4 0.4444444
# 4: 3 5 0.5555556
# 5: 2 2 0.3333333
# 6: 1 5 0.6250000

这是第三个

library(dplyr)
dat %>%
  group_by(x) %>%
  mutate(z = y/sum(y))

# Source: local data frame [6 x 3]
# Groups: x
# 
#   x y         z
# 1 1 3 0.3750000
# 2 2 4 0.6666667
# 3 3 4 0.4444444
# 4 3 5 0.5555556
# 5 2 2 0.3333333
# 6 1 5 0.6250000
wr98u20j

wr98u20j2#

以下是一些碱基R溶液:

    • 1)属性表**将基本prop.table函数与ave一起使用,如下所示:
transform(dat, z = ave(y, x, FUN = prop.table))

给出:

x y         z
1 1 3 0.3750000
2 2 4 0.6666667
3 3 4 0.4444444
4 3 5 0.5555556
5 2 2 0.3333333
6 1 5 0.6250000
    • 2)总和**这也适用于:
transform(dat, z = y / ave(y, x, FUN = sum))
5f0d552i

5f0d552i3#

当然,人们用SQL思考也有一种方法,在这种情况下非常罗嗦,但很好地推广到其他类似的问题:

library(sqldf)
dat <- sqldf("
  with sums as (
    select
      x
      ,sum(y) as sy
    from dat
    group by x
  )
  select
    d.x
    ,d.y
    ,d.y/s.sy as z
  from dat d
  inner join sums s
    on d.x = s.x
")

相关问题