这里是数据集
data <- t(data.frame(met1 = c(2,2,2,2,2),
met2 = c(5,4,NA,2,1),
met3 = c(2,2,2,NA,2),
met4 = c(2,4,6,8,6),
met5 = c(1,3,4,7,2)))
这给:
[,1] [,2] [,3] [,4] [,5]
met1 2 2 2 2 2
met2 5 4 NA 2 1
met3 2 2 2 NA 2
met4 2 4 6 8 6
met5 1 3 4 7 2
我经常对数据集进行逐行校正。在求和后将所有值相除,这意味着所有值都在0到1之间。
data <- data / rowSums(data, na.rm = TRUE)
当没有丢失的数据时,这很好用。但是,正如您在比较met1
和met3
时所看到的,由于缺少数据,met3
的每个值都大大高于met1
。
[,1] [,2] [,3] [,4] [,5]
met1 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met2 0.41666667 0.3333333 NA 0.1666667 0.08333333
met3 0.25000000 0.2500000 0.2500000 NA 0.25000000
met4 0.07692308 0.1538462 0.2307692 0.3076923 0.23076923
met5 0.05882353 0.1764706 0.2352941 0.4117647 0.11764706
我该如何抵消这种影响?目前,我已删除任何缺少数据的列,但我不希望这样做,因为某些重要数据可能会被删除。
您可以通过在分母中计算NA
来取平均值,但这会使met3
中的值“显着”小于met1
。另一种选择是按行均值估算缺失值,然后使用rowSums()
将其归一化。
# Data
data <- t(data.frame(met1 = c(2,2,2,2,2),
met2 = c(5,4,NA,2,1),
met3 = c(2,2,2,NA,2),
met4 = c(2,4,6,8,6),
met5 = c(1,3,4,7,2)))
> data
[,1] [,2] [,3] [,4] [,5]
met1 2 2 2 2 2
met2 5 4 NA 2 1
met3 2 2 2 NA 2
met4 2 4 6 8 6
met5 1 3 4 7 2
# Data imputation
data = apply(data, 1, function(x) {
x[is.na(x)] = mean(x, na.rm = TRUE)
return(x)
}) %>% t()
> data
[,1] [,2] [,3] [,4] [,5]
met1 2 2 2 2 2
met2 5 4 3 2 1
met3 2 2 2 2 2
met4 2 4 6 8 6
met5 1 3 4 7 2
# Normalizing
data <- data / rowSums(data, na.rm = TRUE)
> data
[,1] [,2] [,3] [,4] [,5]
met1 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met2 0.33333333 0.2666667 0.2000000 0.1333333 0.06666667
met3 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met4 0.07692308 0.1538462 0.2307692 0.3076923 0.23076923
met5 0.05882353 0.1764706 0.2352941 0.4117647 0.11764706