在大型数据集中生成最大值

时间:2017-09-21 11:07:22

标签: r max

我有一个名为data_frame的数据框,如此

 period   X      Y   Z
    1     10    20  12
    2     15    14  17
    3     20    35  29
    4     22    45  25
    5     27    16  28
    6     12    20  25

现在我想通过将前两个,第二个,第三个周期2的最大值生成另一个df,其中预期输出是这样的

period  X   Y   Z
  1    15   20  17
  2    22   45  29
  3    27   20  28

3 个答案:

答案 0 :(得分:1)

您可以使用dplyr和其他索引列group by找到最大值:

d <- data_frame(X = sample(1:20, 6, FALSE),
                Y = sample(1:20, 6, FALSE),
                Z = sample(1:20, 6, FALSE))

d
# A tibble: 6 x 4
      X     Y     Z index
  <int> <int> <int> <dbl>
1    15    12    12     1
2    19     5    18     1
3    14     6    20     2
4    20     8    11     2
5     6    13    16     3
6     1    17     9     3

library(dplyr)

d %>% 
  mutate(index = c(1,1,2,2,3,3)) %>% 
  group_by(index) %>% 
  summarise_all(max)

# A tibble: 3 x 4
  index     X     Y     Z
  <dbl> <dbl> <dbl> <dbl>
1     1    19    12    18
2     2    20     8    20
3     3     6    17    16

答案 1 :(得分:1)

以下将做你想要的。

df2 <- data_frame
df2$fact <- (data_frame$period + 1) %/% 2

df <- aggregate(. ~ fact, df2, max)
rm(df2)
df <- df[, -2]
names(df)[1] <- names(data_frame)[1]
df
#  period  X  Y  Z
#1      1 15 20 17
#2      2 22 45 29
#3      3 27 20 28

数据

data_frame <-
structure(list(period = 1:6, X = c(10L, 15L, 20L, 22L, 27L, 12L
), Y = c(20L, 14L, 35L, 45L, 16L, 20L), Z = c(12L, 17L, 29L, 
25L, 28L, 25L)), .Names = c("period", "X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-6L))

修改
如果您想要长度为3的句点,请相应地调整fact

df2$fact <- (data_frame$period + 2) %/% 3

更一般地说,对于长度为n的时段,

df2$fact <- (data_frame$period + n - 1) %/% n

答案 2 :(得分:0)

使用tidyverse,您可以使用以下内容:

data_frame %>%
  mutate(k = period) %>%
  mutate(k = if_else( (mod(k,2)==0), lag(k,1), k)) %>%
  group_by(k) %>%
  summarise_all(max)

然后执行select以仅保留所需的列。