dplyr:将组中的所有值除以组的第一个值

时间:2019-01-24 10:33:39

标签: r dplyr

我的df看起来像这样:

ID    Obs    Value
1     1      26
1     2      13
1     3      52
2     1      1,5
2     2      30

使用dplyr,我添加了附加列Col,这是列值中所有值除以该列中组的第一个值的结果。

ID    Obs    Value    Col
1     1      26       1
1     2      13       0,5
1     3      52       2
2     1      1,5      1
2     2      30       20

我该怎么做?

2 个答案:

答案 0 :(得分:4)

按“ ID”分组后,使用mutate通过将“值”除以“值”的first来创建新列

library(dplyr)
df1 %>%
   group_by(ID) %>%
   mutate(Col = Value/first(Value))

如果first的'Value'为0,而我们不想使用它,则使用逻辑表达式对'Value'进行子集设置,然后采用其中的first

df1 %>%
   group_by(ID) %>%
    mutate(Col = Value/first(Value[Value != 0]))

或者在base R

df1$Col <- with(df1, Value/ave(Value, ID, FUN = head, 1))

注意:“值”中的逗号表明它是character列。在这种情况下,应先将其更改为十进制(.),然后转换为nunmeric,然后进行除法。可以在读取数据的同时完成

答案 1 :(得分:0)

或者,不创建其他列:

library(tidyverse)

df = data.frame(ID=c(1,1,1,2,2), Obs=c(1,2,3,1,2), Value=c(26, 13, 52, 1.5, 30))

df %>% 
  group_by(ID) %>% 
  mutate_at('Value', ~./first(.))
#> # A tibble: 5 x 3
#> # Groups:   ID [2]
#>      ID   Obs Value
#>   <dbl> <dbl> <dbl>
#> 1     1     1   1  
#> 2     1     2   0.5
#> 3     1     3   2  
#> 4     2     1   1  
#> 5     2     2  20

### OR ###
df %>% 
  group_by(ID) %>% 
  mutate_at('Value', function(x) x/first(x))
#> # A tibble: 5 x 3
#> # Groups:   ID [2]
#>      ID   Obs Value
#>   <dbl> <dbl> <dbl>
#> 1     1     1   1  
#> 2     1     2   0.5
#> 3     1     3   2  
#> 4     2     1   1  
#> 5     2     2  20

reprex package(v0.3.0)于2020-01-04创建