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)
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)
另一种方法是将向量放入列表中,然后添加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)