我有一个名为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
答案 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
以仅保留所需的列。