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

时间:2016-08-22 09:17:33

标签: 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))

即:

  year group val
1    1     a 100
2    2     a 200
3    1     b 300
4    2     b 900

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

   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

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

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

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

1 个答案:

答案 0 :(得分:6)

我们可以按'组'分组,然后将'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

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

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