2

在使用 R 时,我经常对在 data.frame 上执行操作感兴趣,我在其中按组汇总变量,然后想将这些汇总值添加回 data.frame。这很容易通过示例显示:

myDF <- data.frame(A = runif(5), B = c("A", "A", "A", "B", "B"))
myDF$Total <- with(myDF, by(A, B, sum))[myDF$B]
myDF$Proportion <- with(myDF, A / Total)

产生:

          A B     Total Proportion
1 0.5272734 A 1.7186369  0.3067975
2 0.5105128 A 1.7186369  0.2970452
3 0.6808507 A 1.7186369  0.3961574
4 0.2892025 B 0.6667133  0.4337734
5 0.3775108 B 0.6667133  0.5662266

这个技巧——本质上是得到一个命名值的向量,并按组在相关行中“传播”或“拉伸”它们——通常是有效的,尽管class(myDF$Total)除非"array"我把.by()c()

我想知道:

  1. 此操作是否有常用名称?
  2. 是否有另一种不那么老套的感觉和/或更快的方法来做到这一点?
  3. 有没有办法做到这一点dplyr?也许有一个我不知道的哈德利批准的动词操作(如变异、排列等)。我知道这很容易summarise(),但我经常需要将这些摘要放回 data.frame。
4

1 回答 1

11

这是使用 base R 执行此操作的一种“不那么老套”的方法。

set.seed(1)
myDF <- data.frame(A = runif(5), B = c("A", "A", "A", "B", "B"))

within(myDF, {
  Total <- ave(A, B, FUN = sum)
  Proportion <- A/Total
})

#           A B Proportion    Total
# 1 0.2655087 A  0.2193406 1.210486
# 2 0.3721239 A  0.3074170 1.210486
# 3 0.5728534 A  0.4732425 1.210486
# 4 0.9082078 B  0.8182865 1.109890
# 5 0.2016819 B  0.1817135 1.109890

在“dplyr”语言中,我猜你正在寻找mutate

myDF %>%
  group_by(B) %>%
  mutate(Total = sum(A), Proportion = A/Total)

# Source: local data frame [5 x 4]
# Groups: B
# 
#           A B    Total Proportion
# 1 0.2655087 A 1.210486  0.2193406
# 2 0.3721239 A 1.210486  0.3074170
# 3 0.5728534 A 1.210486  0.4732425
# 4 0.9082078 B 1.109890  0.8182865
# 5 0.2016819 B 1.109890  0.1817135

“dplyr 简介”小插图中,您会发现以下描述:

除了从现有列集中进行选择外,添加作为现有列的函数的新列通常也很有用。这是 的工作mutate()dplyr::mutate()的工作方式plyr::mutate()base::transform(). mutate()和之间的主要区别在于transform()mutate 允许您引用刚刚创建的列。


此外,由于您已标记此“data.table”,因此您可以很容易地在“data.table”中将命令“链接”在一起,以执行以下操作:

DT <- data.table(myDF)
DT[, Total := sum(A), by = B][, Proportion := A/Total][]
于 2014-02-20T18:39:51.240 回答