假设我有一个矩阵
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
[2,] 9 10 15 4
[3,] 5 7 4 10
[4,] 1 2 6 2
我想删除列中值为<=5的部分。即使列的下一行有更高的值(即。[2,4]后面的[3,4]是<5),它们将变成0,所以应该剩下:
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
[2,] 9 10 15 NA
[3,] NA 7 NA NA
[4,] NA NA NA NA
矩阵是通过使用for循环来迭代人口100次来创建的,所以我的矩阵是100x100。我试图在for循环中使用if函数来删除列的部分内容,但它只是删除了第一个列之后的所有列。
if(matrix[,col]<=5) break
下面是用NA替换矩阵中所需值的方法:
# Create a random matrix with 20 rows and 20 columns
m <- matrix(floor(runif(400, min = 0, max = 101)), nrow = 20)
# Function that iterates through a vector and replaces values <= 5
# and the following values with NA
f <- function(x) {
fillNA <- FALSE
for (i in 1:length(x)) {
if (fillNA || x[i] <= 5) {
x[i] <- NA
fillNA <- TRUE
}
}
x
}
# Apply the function column-wise
apply(m, 2, f)
我们可以用r为底,假设你的矩阵叫做m
。下面的函数执行以下操作:
- 检查每个元素是否为
<=
5,产生TRUE/FALSE值 - 累计和TRUE/FALSE值。
- 将所有非零累积值替换为NA。
- 使用
apply
对矩阵的每列执行此操作
可以放在一行中:
m2 <- apply(m, 2, (x) ifelse(cumsum(x <= 5), NA, x))
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
[2,] 9 10 15 NA
[3,] NA 7 NA NA
[4,] NA NA NA NA
# Load the necessary packages
library(dplyr)
# Set the seed for reproducibility
set.seed(123)
# Create a random matrix with 100 rows and 100 columns
matrix <- matrix(runif(10000), nrow = 100)
# Replace values in each row of the matrix that are <= 5 with NA
matrix[apply(matrix, 1, function(x) any(x <= 5)), ] <- NA
# View the modified matrix
matrix
此代码首先加载dplyr包,该包对于此任务不是必需的,但在这里用于创建一个随机矩阵。然后,它为再现性设置种子,以便每次运行代码时都生成相同的随机矩阵。接下来,它使用runif函数创建一个包含100行和100列的随机矩阵,该函数生成0到1之间的随机均匀数。最后,它使用apply函数将逻辑应用于矩阵的每一行,并用NA替换为<= 5的任何值。