isD*_*otR 2 r dplyr data.table
在使用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)
Run Code Online (Sandbox Code Playgroud)
产生:
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
Run Code Online (Sandbox Code Playgroud)
这一招-基本得到指定值的矢量和"传播"或跨组相关行"拉伸"他们-一般的作品,虽然class(myDF$Total)是"array"除非我把by()的内部c().
我想知道:
dplyr?也许有一个哈德利批准的动词操作(如变异,安排等),我不知道.我知道这很容易summarise(),但我经常需要将这些摘要放回data.frame中.A5C*_*2T1 11
这是使用基础R执行此操作的"不那么hacky"的方法.
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
Run Code Online (Sandbox Code Playgroud)
在"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
Run Code Online (Sandbox Code Playgroud)
从"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][]
Run Code Online (Sandbox Code Playgroud)