如何計算來自 df 的每 n 個向量的平均值,從而創建一個帶有結果的新資料框。
我希望得到:第 1 列:均值 (V1,V2),第 2 列:均值 (V3,V4),第 3 列:均值 (V5,V6) 等等
資料
df <- data.frame(v1=1:6,V2=7:12,V3=13:18,v4=19:24,v5=25:30,v6=31:36)
uj5u.com熱心網友回復:
你可以試試,
dummy <- data.frame(
v1 = c(1:10),
v2 = c(1:10),
v3 = c(1:10),
v4 = c(1:10),
v5 = c(1:10),
v6 = c(1:10)
)
nvec_mean <- function(df, n){
res <- c()
m <- matrix(1:ncol(df), ncol = n, byrow = T)
if (ncol(df) %% n != 0){
stop()
}
for (i in 1:nrow(m)){
v <- rowMeans(df[,m[i,]])
res <- cbind(res, v)
}
colnames(res) <- c(1:nrow(m))
res
}
nvec_mean(dummy,3)
1 2
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
[10,] 10 10
如果您不想要rowMeans或結果不是您想要的,請告訴我。
簡單(?)版本
df <- data.frame(v1=1:6,V2=7:12,V3=13:18,v4=19:24,v5=25:30,v6=31:36)
n = 2
res <- c()
m <- matrix(1:ncol(df), ncol = 2, byrow = T)
for (i in 1:nrow(m)){
v <- rowMeans(df[,m[i,]])
res <- cbind(res, v)
}
res
v v v
[1,] 4 16 28
[2,] 5 17 29
[3,] 6 18 30
[4,] 7 19 31
[5,] 8 20 32
[6,] 9 21 33
uj5u.com熱心網友回復:
這是基本的 R 選項
n <- 2 # Mean across every n = 2 columns
do.call(cbind, lapply(seq(1, ncol(df), by = n), function(idx) rowMeans(df[c(idx, idx 1)])))
# [,1] [,2] [,3]
#[1,] 4 16 28
#[2,] 5 17 29
#[3,] 6 18 30
#[4,] 7 19 31
#[5,] 8 20 32
#[6,] 9 21 33
這將回傳 amatrix而不是 a data.frame(這在這里更有意義,因為您正在處理“全數字”資料)。
說明:這個想法是一種非重疊的滑動視窗方法。seq(1, ncol(df), by = n)創建列的起始索引(此處為:1、3、5)。然后我們遍歷這些索引idx并計算 的行均值df[c(idx, idx 1)]。這將回傳 a list,然后我們將其cbind轉換為 a matrix。
作為一個小修改,您還可以data.frame使用正確的維度預定義 a ,然后do.call(cbind, ...)通過讓 R 執行隱式型別轉換list來跳過該步驟data.frame。
out <- data.frame(matrix(NA, ncol = ncol(df) / 2, nrow = nrow(df)))
out[] <- lapply(seq(1, ncol(df), by = n), function(idx) rowMeans(df[c(idx, idx 1)]))
# X1 X2 X3
#1 4 16 28
#2 5 17 29
#3 6 18 30
#4 7 19 31
#5 8 20 32
#6 9 21 33
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/347575.html
