通过从数据集的子集中选择最大值来创建数据框

时间:2018-08-12 02:47:48

标签: r dataframe unique

我希望通过从第一个数据帧中选择最大子集来从另一个数据帧中创建一个数据帧。说我有第一个数据框

df:

name     date      weekday    util
----     ----      -------    ---- 
alpha    201801          1    10.1
alpha    201801          2    7.1
alpha    201801          3    1.1 
alpha    201801          4    4.1  
bravo    201801          1    9.9
bravo    201801          2    8.9
bravo    201801          3    1.9
bravo    201801          4    11.9
charlie  201801          1    0.1
charlie  201801          2    2.0
charlie  201801          3    7.3
charlie  201801          4    5.0

我希望使用max util为每个唯一日期创建另一个数据框,名称为元组

df_unique:

name       date       util
-----      ----       ----
alpha      201801     10.1
bravo      201801     11.9
charlie    201801     7.3

我知道我们可以使用

选择一个最大值
>max(df[df$name == 'alpha' && df$date == 201801, df$util])
10.1

但是,我们将如何对每个唯一名称(日期元组)执行此操作。这是否有可能,或者我需要创建一个函数来做到这一点?

1 个答案:

答案 0 :(得分:0)

这是使用data.table软件包的解决方案。

library(data.table)

setDT(dat)

dat2 <- dat[, .(util = max(util)), by = .(name, date)]
dat2
#       name   date util
# 1:   alpha 201801 10.1
# 2:   bravo 201801 11.9
# 3: charlie 201801  7.3

或者我们可以使用dplyr包。

library(dplyr)

dat2 <- dat %>%
  group_by(name, date) %>%
  summarise(util = max(util)) %>%
  ungroup()
dat2
# # A tibble: 3 x 3
#   name      date  util
#   <chr>    <int> <dbl>
# 1 alpha   201801  10.1
# 2 bravo   201801  11.9
# 3 charlie 201801   7.3

数据

dat <- read.table(text = "name     date      weekday    util
                  alpha    201801          1    10.1
                  alpha    201801          2    7.1
                  alpha    201801          3    1.1 
                  alpha    201801          4    4.1  
                  bravo    201801          1    9.9
                  bravo    201801          2    8.9
                  bravo    201801          3    1.9
                  bravo    201801          4    11.9
                  charlie  201801          1    0.1
                  charlie  201801          2    2.0
                  charlie  201801          3    7.3
                  charlie  201801          4    5.0",
                  header = TRUE, stringsAsFactors = FALSE)