我有一個看起來像這樣的資料框 df
time object
1 1 A
2 2 A
3 3 A
4 4 A
5 5 A
6 6 A
7 7 B
8 8 B
9 9 B
10 10 B
11 11 B
12 12 C
13 13 C
14 14 C
15 15 C
16 16 C
17 17 C
18 18 C
我想根據time列每 3 行獲取object列的平均值
df_mean
time object
1 2 A
2 5 A
3 8 B
4 13 C
5 16 C
我雖然關于使用 dplyr
df%>%
mutate(grp = 1 (row_number()-1) %/% 3) %>%
group_by(grp) %>%
summarise(across(c("time"), mean, na.rm = TRUE)) %>%
select(-grp)
但我不知道如何為物件集成控制元件。
另一種選擇是使用聚合
aggregate(.~object, data=df, mean)
但在這種情況下,我不知道如何獲得每 3 行的平均值。
uj5u.com熱心網友回復:
您的 dplyr 嘗試是在正確的軌道上。經過一些修改,它就可以作業了。
library(dplyr)
df <- tibble(time = 1:18, object = rep(c('A', 'B', 'C'), each = 6))
df %>%
group_by(object, grp = (row_number()-1) %/% 3) %>%
summarise(across(time, mean, na.rm = T), .groups = 'drop') %>%
select(-grp)
#> # A tibble: 6 × 2
#> object time
#> <chr> <dbl>
#> 1 A 2
#> 2 A 5
#> 3 B 8
#> 4 B 11
#> 5 C 14
#> 6 C 17
uj5u.com熱心網友回復:
這是另一種dplyr方法:
library(dplyr)
n = 3
df %>%
group_by(object, Col2 = rep(row_number(), each=n, length.out = n())) %>%
summarise(time = mean(time, na.rm = TRUE)) %>%
select(-Col2)
object time
<chr> <dbl>
1 A 2
2 A 5
3 B 8
4 B 11
5 C 14
6 C 17
uj5u.com熱心網友回復:
您可以稍作修改,首先grp在組內創建變數object,然后過濾聯合分組的大小> = 3,然后總結:
df%>%
group_by(object) %>%
mutate(grp = 1 (row_number()-1) %/% 3) %>%
group_by(object,grp) %>%
filter(n()>=3) %>%
summarize(time=mean(time), .groups="drop") %>%
select(-grp)
輸出:
object time
<chr> <dbl>
1 A 2
2 A 5
3 B 8
4 C 13
5 C 16
uj5u.com熱心網友回復:
data.table選項:
library(data.table)
setDT(df)
df[, n3:=gl(.N, 3, length=.N), by=object]
df[, .(time=mean(time)), by=.(object, n3)][, !"n3"]
輸出:
object time
1: A 2
2: A 5
3: B 8
4: B 11
5: C 14
6: C 17
uj5u.com熱心網友回復:
在基礎 R 中:
aggregate(time~., cbind(df, gr=gl(nrow(df),3, nrow(df))), mean)
object gr time
1 A 1 2
2 A 2 5
3 B 3 8
4 B 4 11
5 C 5 14
6 C 6 17
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/488581.html
標籤:r
下一篇:從R中以數字結尾的目錄中選擇檔案
