b=c(1,4,3,NA)
c=c(NA,4,3,8)
res=(b+c)/2
NA 4 3 NA
Run Code Online (Sandbox Code Playgroud)
你可以看到每当我们得到NA返回的结果时NA.我想计算b and c两者之间的平均值,如果两者都有值,但是如果两者b or c都有NA,则只返回值b or c.期望的结果将是:
res
1 4 3 8
Run Code Online (Sandbox Code Playgroud)
我们可以使用rowMeans 后,cbind荷兰国际集团的矢量"B","C"来创建一个matrix. rowMeans有options(na.rm = TRUE)来处理NA值.
rowMeans(cbind(b,c), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
或者colMeans在rbind矢量之后.
colMeans(rbind(b,c), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
假设我们有矩阵而不是向量,我们仍然可以rowMeans/colMeans循环遍历其中一个数据集的列/行(假设它们具有相同的维度).例如,
b <- matrix(c(1,4,3, NA, 2, 3, NA, 2), ncol=2)
c <- matrix(c(NA, 4, 3, 8, 1, NA, 3, 4), ncol=2)
Run Code Online (Sandbox Code Playgroud)
我们循环虽然列顺序(seq_len(ncol(b)))用sapply,cbind"B"和"C",并获得相应的列rowMeans.输出将matrix与初始矩阵具有相同的维度.
m1 <- sapply(seq_len(ncol(b)), function(i)
rowMeans(cbind(b[,i], c[,i]), na.rm=TRUE))
m1
# [,1] [,2]
#[1,] 1 1.5
#[2,] 4 3.0
#[3,] 3 3.0
#[4,] 8 3.0
Run Code Online (Sandbox Code Playgroud)
另一个选择而不是循环是用NA两个数据集替换元素0.我们可以使用replace它,+根据NA每个位置的元素数量进行划分.
m2 <- (replace(b, which(is.na(b)), 0) + replace(c, which(is.na(c)), 0))
m2/(2-(is.na(b)+is.na(c)))
# [,1] [,2]
#[1,] 1 1.5
#[2,] 4 3.0
#[3,] 3 3.0
#[4,] 8 3.0
Run Code Online (Sandbox Code Playgroud)
使用NAerfrom 可以使上述代码更紧凑library(qdap)
library(qdap)
(NAer(b) + NAer(c))/(2-(is.na(b)+is.na(c)))
# 1 2
#1 1 1.5
#2 4 3.0
#3 3 3.0
#4 8 3.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |