不同长度向量的均值

Bel*_*_18 11 r data-manipulation mean

我有 5 个不同长度的向量

a <- c(1) #with length of 1
b <- c(4.4,3.5) #length 2
c <- c(5.6,7.8,6.0) #length 3
d <- c(0.8,6.9,8.8,5.8) #length 4
e <- c(1.8,2.5,2.3,6.5,1.1) #length is 5
Run Code Online (Sandbox Code Playgroud)

我试图获取所有向量中元素的平均值:

 #since there are 5 values available for 1st element
 a[1]+b[1]+c[1]+d[1]+e[1] / 5 

 #since there are 4 values available for 2nd element
 b[2]+c[2]+d[2]+e[2] / 4 

#next divide by 3 and 2...1
c[3]+d[3]+e[3] / 3 and so on...
Run Code Online (Sandbox Code Playgroud)

我需要另一个数组中这些值的平均值,以便我可以进一步处理数据。

Ony*_*mbu 15

l <- list(a, b, c, d, e)
Run Code Online (Sandbox Code Playgroud)

然后做:

tapply(unlist(l), sequence(lengths(l)), mean)
    1     2     3     4     5 
2.720 5.175 5.700 6.150 1.100 
Run Code Online (Sandbox Code Playgroud)

另一种方法:

rowMeans(sapply(l, `length<-`, max(lengths(l))), na.rm = TRUE)
[1] 2.720 5.175 5.700 6.150 1.100
Run Code Online (Sandbox Code Playgroud)
colMeans(plyr::rbind.fill.matrix(sapply(l, t)), na.rm = TRUE)
    1     2     3     4     5 
2.720 5.175 5.700 6.150 1.100 
Run Code Online (Sandbox Code Playgroud)


Maë*_*aël 12

data.table::transpose

l <- list(a, b, c, d, e)
sapply(data.table::transpose(l), mean, na.rm = TRUE)
# [1] 2.720 5.175 5.700 6.150 1.100
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 9

1)创建向量列表并将每个向量转换为 ts 对象。然后使用 cbind 创建一个多元 ts 对象,其中每一列对应于一个原始向量。然后使用 rowMeans 。

nms <- c("a", "b", "c", "d", "e")
L <- mget(nms)
rowMeans(do.call("cbind", lapply(L, ts)), na.rm = TRUE)
## [1] 2.720 5.175 5.700 6.150 1.100
Run Code Online (Sandbox Code Playgroud)

查看

(a[1] + b[1] + c[1] + d[1] + e[1]) / 5
## [1] 2.72

( b[2]+c[2]+d[2]+e[2]) / 4 
## [1] 5.175
Run Code Online (Sandbox Code Playgroud)

2)使用上面的 L 的另一种方法是使用 sapply:

n <- max(lengths(L))
sapply(1:n, function(i) mean(c(a[i], b[i], c[i], d[i], e[i]), na.rm = TRUE))
## [1] 2.720 5.175 5.700 6.150 1.100
Run Code Online (Sandbox Code Playgroud)

3)或像这样使用 sapply,其中 L 和 n 来自上面:

rowMeans(sapply(L, `[`, 1:n), na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)


ben*_*n23 5

另一种方法是将向量放入列表中,然后添加NA向量以使它们长度相等。最后对rowMeans他们做一个。

mylist <- list(a, b, c, d ,e)
max_L <- max(lengths(mylist))

rowMeans(sapply(mylist, \(x) c(x, rep(NA, max_L - length(x)))), na.rm = T)
[1] 2.720 5.175 5.700 6.150 1.100
Run Code Online (Sandbox Code Playgroud)