我有以下数据框,其中“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”值的总和。
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
wr98u20j2#
以下是一些碱基R溶液:
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
transform(dat, z = y / ave(y, x, FUN = sum))
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 ")
3条答案
按热度按时间3wabscal1#
解决这个问题的方法有很多,这里有一个
还有一种可能
这是第三个
wr98u20j2#
以下是一些碱基R溶液:
prop.table
函数与ave
一起使用,如下所示:给出:
5f0d552i3#
当然,人们用SQL思考也有一种方法,在这种情况下非常罗嗦,但很好地推广到其他类似的问题: