This question already has answers here:
How to use Dplyr's Summarize and which() to lookup min/max values

(3 个回答)


2年前关闭。




我正在尝试通过 R 中的分组变量创建多个条件。
我想要做的是在分组变量中获取索引的 minmax 并提取出相应的价格。所需的输出如下所示
df <- data.frame(ID = c("ABC", "ABC", "BCD", "BCD", "BCD", "DEF", "DEF"),
                 Price = c(31, 81, 100, 84, 15, 31, 42),
                 Index = c(3,6,2,9,5,12,18))

df
   ID Price Index
1 ABC    31     3
2 ABC    81     6
3 BCD   100     2
4 BCD    84     9
5 BCD    15     5
6 DEF    31    12
7 DEF    42    18

例如,如果我们查看 ID = "BCD",则有 3 个条目。根据指数,在 min(index) = 2 处,价格 = 100,在 max(index) = 9 处,价格为 84


df %>% group_by(ID) %>% mutate(firstPrice = min(df$Order), lastPrice = max(df$Order))

  ID    Price Order firstPrice lastPrice
  <fct> <dbl> <dbl>      <dbl>     <dbl>
1 ABC      31     3          2        18
2 ABC      81     6          2        18
3 BCD     100     2          2        18
4 BCD      84     9          2        18
5 BCD      15     5          2        18
6 DEF      31    12          2        18
7 DEF      42    18          2        18

预期输出
ID    Price     Order firstPrice lastPrice
1 ABC      31     3        31       81
2 ABC      81     6        31       81
3 BCD     100     2        100      84
4 BCD      84     9        100      84
5 BCD      15     5        100      84
6 DEF      31    12        31       42
7 DEF      42    18        31       42

最佳答案

我们可以 group_by ID 并使用 which.minwhich.max 获取索引,然后从中获取对应的 Price

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(firstPrice = Price[which.min(Index)],
         lastPrice = Price[which.max(Index)])



#   ID    Price Index firstPrice lastPrice
#  <fct> <dbl> <dbl>      <dbl>     <dbl>
#1 ABC      31     3         31        81
#2 ABC      81     6         31        81
#3 BCD     100     2        100        84
#4 BCD      84     9        100        84
#5 BCD      15     5        100        84
#6 DEF      31    12         31        42
#7 DEF      42    18         31        42

关于r - 使用 dplyr 通过分组变量解析多个条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54251065/

10-12 18:50