簡體   English   中英

將行值除以 R data.frame 中的聚合總和

[英]Divide row value by aggregated sum in R data.frame

我有以下數據框

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

現在我想得到第三列,將 y 行值除以聚合 y 值(基於 x 列中的唯一值)。 所以,然后我得到第 1 行如下: 1,3,0.375; 0.375 已計算為 3 / (5+3)。

我對 R 比較陌生,希望你能幫助我。 謝謝!

解決這個問題的方法有很多種,這里有一個

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

以下是一些基本的 R 解決方案:

1) prop.table使用帶有ave的基本prop.table函數,如下所示:

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) sum這也有效:

transform(dat, z = y / ave(y, x, FUN = sum))

當然,人們有一種用 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
")    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM