将每个组中的行根据该组的第一行进行变异

8
例如,我有一个数据框:
df <- data.frame(grp = c(1,1,1,1,1,2,2,2,2,2),
                 idx = c(1,2,3,4,5,1,2,3,4,5),
                 val = c(4,6,1,7,2,8,5,3,9,1))

我希望将每行的值除以每个组中第一行的值。我找到的唯一方法是引入一个新的列:

 df %>% group_by(grp) %>%
        arrange(idx) %>%
        mutate(t = ifelse(row_number(idx) == 1, val, 0)) %>%
        mutate(val = val / sum(t))

有没有简单的方法来做到这一点?

8
在dplyr中有一个名为first的函数,可以帮助你。df %>% group_by(grp) %>% mutate(val = val/first(val))。该函数可用于按组对数据进行分组,并计算每组内每个值相对于该组内第一个值的比值。 - Ronak Shah
太好了!那就是我正在寻找的函数。 - Zephyr Dodolee
1个回答

11

我们可以做到

 df %>%
  group_by(grp) %>%
  arrange(idx) %>%
  mutate(val = val/sum((row_number() == 1)*val))
# A tibble: 10 x 3
# Groups:   grp [2]
#     grp   idx   val
#   <dbl> <dbl> <dbl>
# 1     1     1 1.000
# 2     2     1 1.000
# 3     1     2 1.500
# 4     2     2 0.625
# 5     1     3 0.250
# 6     2     3 0.375
# 7     1     4 1.750
# 8     2     4 1.125
# 9     1     5 0.500
#10     2     5 0.125
如果我们需要通过第一个 "val" 观察值进行划分,只需执行 val [1L]
df %>%
   group_by(grp) %>%
   arrange(idx) %>%
   mtuate(val = val/val[1L])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接