R语言 在第三个变量最小的行中创建一个新列,该列等于另一个变量的值

yyhrrdl8  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(88)

我有一个这样的dataframe:

df <- data.frame(day = rep(1:7, 4),
                 week = rep(1:4, each=7),
                 price = round(runif(28), 2))

我想创建一个新列price_day_1,它等于price,其中day的相应值在每周内最小。很久以前我有一个解决方案,我认为从group_by开始,然后是mutate,其中可能包含where函数。我想一个解决方案,不涉及创建一个新的数据框,循环,绑定列或行或类似的东西,我很肯定有一个整洁的方式来做一个单一的mutate(也许与前面的group_by)。
我试着玩了一下mutategroup_by,并查看了where的帮助部分。

vohkndzv

vohkndzv1#

您可以通过dayfirst条目索引price

library(dplyr)

df %>% mutate(price_day_1 = price[min(day) == day], .by = week)

   day week price price_day_1
1    1    1  0.67        0.67
2    2    1  0.37        0.67
3    3    1  0.65        0.67
4    4    1  0.21        0.67
5    5    1  0.24        0.67
6    6    1  0.47        0.67
7    7    1  0.49        0.67
8    1    2  0.32        0.32
9    2    2  0.28        0.32
10   3    2  0.48        0.32
11   4    2  0.46        0.32
12   5    2  0.47        0.32
13   6    2  0.06        0.32
14   7    2  0.03        0.32
15   1    3  0.78        0.78
16   2    3  0.74        0.78
17   3    3  0.95        0.78
18   4    3  0.24        0.78
19   5    3  0.68        0.78
20   6    3  0.96        0.78
21   7    3  0.42        0.78
22   1    4  0.62        0.62
23   2    4  0.13        0.62
24   3    4  0.95        0.62
25   4    4  0.09        0.62
26   5    4  0.80        0.62
27   6    4  0.30        0.62
28   7    4  0.00        0.62
f4t66c6m

f4t66c6m2#

在评论中更新了以下OP的解释,并通过包含arange(day)使其更加稳健。

library(dplyr)

set.seed(123)

df <- data.frame(day = rep(1:7, 4),
                 week = rep(1:4, each=7),
                 price = round(runif(28), 2))
df1 <- 
  df |> 
  group_by(week) |> 
  arrange(day) |>
  mutate(price_day1 = first(price))

head(df1, 14)
#> # A tibble: 14 × 4
#> # Groups:   week [2]
#>      day  week price price_day1
#>    <int> <int> <dbl>      <dbl>
#>  1     1     1  0.29       0.29
#>  2     2     1  0.79       0.29
#>  3     3     1  0.41       0.29
#>  4     4     1  0.88       0.29
#>  5     5     1  0.94       0.29
#>  6     6     1  0.05       0.29
#>  7     7     1  0.53       0.29
#>  8     1     2  0.89       0.89
#>  9     2     2  0.55       0.89
#> 10     3     2  0.46       0.89
#> 11     4     2  0.96       0.89
#> 12     5     2  0.45       0.89
#> 13     6     2  0.68       0.89
#> 14     7     2  0.57       0.89

创建于2023-05-24使用reprex v2.0.2

相关问题