我有一个大矩阵,我想从中删除NA并将下一个值移到它的位置。我不想删除整个行或列。我需要清理这个矩阵,所以我很容易将它导入excel。
我的矩阵:
> head(m)
NA 21005.00 801515021 50 132 6.83
901.56 21049.00 801515025 NA 200 249
所需的矩阵:
> head(m)
21005.00 801515021 50 132 6.83 901.56
21049.00 801515025 NA 200 249 921.03
答案 0 :(得分:1)
您的示例意味着在删除Na值后,您的矩阵具有一种“自然”结构(即整数低于整数,同一列中的类似大小的值)。你可以这样做:
new_matrix <- matrix( m[!is.na(m)], nrow = ..., ncol = ..., byrow = TRUE)
这将获取矩阵的非Na值,并从中生成一个新矩阵,您可以在nrow和ncol中指定维度。
答案 1 :(得分:1)
好吧,如果我的任务正确,你想要消除所有的NA值并将下一个值移到它的位置BY ROW,即从右边的左边。
这是实现此目的的代码。为了使矩阵尺寸与原始尺寸相同,新矩阵的末端用0填充。
# create initial matrix
m <- matrix(data = c(NA, 21005.00, 801515021, 50, 132, 6.83, 901.56, 21049.00, 801515025, NA, 200, 249), 2,6, byrow = TRUE)
c <- 1
n <- list()
# run through initial matrix and if value is not NA, add to new list
for (i in 1:dim(m)[1]) {
for (j in 1:dim(m)[2]) {
if (!is.na(m[i,j])) {
n[[c]] <- m[i,j]
c <- c + 1
}
}
}
# append 0s to the end to keep initial matrix dimensions
for (i in 1:(length(m) - length(n)) ) {
n[[c+1]] <- 0
c <- c + 1
}
# convert result to matrix
new <- matrix(unlist(n), ncol = dim(m)[2], byrow = TRUE)
您的初始数据:
NA 21005.00 801515021 50 132 6.83
901.56 21049.00 801515025 NA 200 249
代码的结果:
21005.00 801515021 50 132 6.83 901.56
21049.00 801515025 200 249 0.00 0.00