我的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
我该怎么做?
答案 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创建