使用组内的第一个元素规范化所有行

use*_*592 1 r dataframe dplyr

是否有一种优雅的方法来使用dplyr对具有特定于组的规范的列进行规范化?

示例:我有一个数据框:

df = data.frame(year=c(1:2, 1:2),
                group=c("a", "a", "b", "b"),
                val=c(100, 200, 300, 900))
Run Code Online (Sandbox Code Playgroud)

即:

  year group val
1    1     a 100
2    2     a 200
3    1     b 300
4    2     b 900
Run Code Online (Sandbox Code Playgroud)

我想val通过给定组的year = 1中的值进行标准化.期望的输出:

   year group val val_norm
1    1     a 100        1
2    2     a 200        2
3    1     b 300        1
4    2     b 900        3
Run Code Online (Sandbox Code Playgroud)

例如,在第4行中,norm = 300(年= = 1&group =="b"),因此val_norm = 900/300 = 3.

我可以通过仅使用规范提取辅助数据帧然后在原始数据帧上执行左连接来实现此目的.

在不创建临时数据框架的情况下实现此目的的更优雅方法是什么?

akr*_*run 6

我们可以按'group'分组,然后将'val'除以'val',其中'year'是1(year==1).在这里,我选择第一个观察(如果每个'组'有1个重复的'年').

library(dplyr)
df %>% 
    group_by(group) %>% 
    mutate(val_norm = val/val[year==1][1L])
#      year  group   val val_norm
#  <int> <fctr> <dbl>    <dbl>
#1     1      a   100        1
#2     2      a   200        2
#3     1      b   300        1
#4     2      b   900        3
Run Code Online (Sandbox Code Playgroud)

如果我们需要优雅和高效,data.table可以尝试

library(data.table)
setDT(df)[, val_norm := val/val[year==1][1L] , by = group]
Run Code Online (Sandbox Code Playgroud)

  • 优秀.我不知道有人可以在mutate中做subselects([year == 1]).这很棒.还要感谢data.table奖金. (3认同)