带for循环的ifelse
我希望遍历矩阵的行,并根据条件对数据项执行一些操作 下面是我的代码带for循环的ifelse,r,matrix,R,Matrix,我希望遍历矩阵的行,并根据条件对数据项执行一些操作 下面是我的代码 m = matrix(c(1,2,NA,NA,5,NA,NA,1,NA,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA), nrow = 5, ncol = 4) if (m[,colSums(!is.na(m)) > 1, drop = FALSE]){ for(i in 1:4){ a = which(m[i,] != "NA") - mean(which(!i
m = matrix(c(1,2,NA,NA,5,NA,NA,1,NA,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA), nrow = 5, ncol = 4)
if (m[,colSums(!is.na(m)) > 1, drop = FALSE]){
for(i in 1:4){
a = which(m[i,] != "NA") - mean(which(!is.na(m[i,])))
for(j in 2:5){
b = which(m[j,] != "NA") - mean(which(!is.na(m[j,])))
prod(a,b)
}
}
}
我在“如果”状态下收到如下警告消息
Warning message:
In if (m[, colSums(!is.na(m)) > 1, drop = FALSE]) { :
the condition has length > 1 and only the first element will be used
我知道它返回一个向量,我应该使用ifelse块。如何将for循环合并到ifelse块中?这似乎是一个基本问题,我是R.的新手。根据您的描述,您希望按列检查矩阵中非NA的数量,然后根据此结果执行某些操作(这就是为什么需要“if”/“ifelse”语句)。因此,您可以按如下方式实现,并在特定函数中编写内部循环
yourFunc <- function(x, data) {
# do what your want / your loops on "data"
# sample, you can check the result in here
if(x > 1) 1
else 0
}
m = matrix(c(1,2,NA,NA,5,NA,NA,1,NA,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA), nrow = 5, ncol = 4)
# use "apply" series function in here
sapply(colSums(!is.na(m)), yourFunc, data=m)
#[1] 1 0 1 0
yourFunc 1)1
其他0
}
m=基质(c(1,2,NA,NA,5,NA,NA,NA,1,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA,NA,nrow=5,ncol=4)
#在此处使用“应用”系列功能
sappy(colSums(!is.na(m)),yourFunc,data=m)
#[1] 1 0 1 0
实际上,我认为您需要重新组织问题并优化代码,“ifelse with for循环”可能完全没有必要 根据您的描述,您希望按列检查矩阵中非NA的数量,然后根据此结果执行某些操作(这就是为什么需要“if”/“ifelse”语句的原因)。因此,您可以按如下方式实现,并在特定函数中编写内部循环
yourFunc <- function(x, data) {
# do what your want / your loops on "data"
# sample, you can check the result in here
if(x > 1) 1
else 0
}
m = matrix(c(1,2,NA,NA,5,NA,NA,1,NA,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA), nrow = 5, ncol = 4)
# use "apply" series function in here
sapply(colSums(!is.na(m)), yourFunc, data=m)
#[1] 1 0 1 0
yourFunc 1)1
其他0
}
m=基质(c(1,2,NA,NA,5,NA,NA,NA,1,NA,NA,NA,4,5,NA,NA,NA,NA,NA,NA,NA,nrow=5,ncol=4)
#在此处使用“应用”系列功能
sappy(colSums(!is.na(m)),yourFunc,data=m)
#[1] 1 0 1 0
实际上,我认为您需要重新组织问题并优化代码,“ifelse with for循环”可能完全没有必要 由于您是R新手,我想有些术语可能有点 令人困惑下面是关于
if语句的一点解释
让我们看看如果条件:
m[,colSums(!is.na(m)) > 1, drop = FALSE]
[,1] [,2]
[1,] 1 NA
[2,] 2 NA
[3,] NA 4
[4,] NA 5
[5,] 5 NA
如果必须满足if条件,则if
不能使用此条件
布尔值(计算为真/假)。那么为什么会有这样的结果呢?那么结果呢,
colSums(!is.na(m))
[1] 3 1 2 0
不是NA
的条目计数向量(=每列中的TRUE数)。小心点,因为这与
colSums(m, na.rm = TRUE)
[1] 8 1 9 0
它为每列返回五行总和的向量,不包括NA
。我猜后者就是你要找的。在任何情况下:请注意差异
通过询问这些和中的哪一个大于1,可以得到一个布尔向量
colSums(!is.na(m)) > 1
[1] TRUE FALSE TRUE FALSE
但是,使用该布尔向量作为选择列的标准,可以正确地得到一个显然不是布尔值的矩阵:
m[,colSums(!is.na(m)) > 1]
注意:drop=FALSE
在这里是不必要的,因为没有可能被删除的维度。请参阅?[
或下拉
。您可以使用相同
来验证这一点:
现在进入循环。你会发现大量关于避免for循环和使用apply函数族的讨论。我怀疑你必须花一些时间来完成所有这些。但是,请注意,使用apply
——与一般的看法相反——在速度方面并不一定优于for
循环,因为它实际上只是一个fancy包装在for
循环中(检查源代码!)。但是,它在代码清晰性方面明显优于它,因为它紧凑且清楚它在做什么。因此,如果可能,请尝试使用apply
函数
为了重写您的循环,如果您可以口头
请描述您实际想要做什么,因为我假设
现在所做的可能不是您想要的。Aswhich()
返回向量或矩阵中元素的索引/位置
我们要做的是:
indices of the i'th row that are not NA (for a given column) - mean over these indices
虽然这在理论上是可能的,但这通常没有多大意义。因此,我手头上有所有的笔记:清楚地说明您的问题,以便我们可以想出解决办法。由于您是R的新手,我认为其中一些术语可能有点不合理
令人困惑。下面是关于if语句的一点解释
让我们看看如果条件:
m[,colSums(!is.na(m)) > 1, drop = FALSE]
[,1] [,2]
[1,] 1 NA
[2,] 2 NA
[3,] NA 4
[4,] NA 5
[5,] 5 NA
如果必须满足if条件,则if
不能使用此条件
布尔值(计算为真/假)。那么为什么会有这样的结果呢
colSums(!is.na(m))
[1] 3 1 2 0
是不是NA
!
(=每列中的TRUE数)的条目计数的向量。请小心,因为这与
colSums(m, na.rm = TRUE)
[1] 8 1 9 0
它为每列返回所有五行的和向量,不包括NA
。我猜后者就是您要查找的。无论如何,请注意差异!
通过询问这些和中的哪一个大于1,可以得到一个布尔向量
colSums(!is.na(m)) > 1
[1] TRUE FALSE TRUE FALSE
但是,使用该布尔向量作为选择列的标准,可以正确地得到一个显然不是布尔值的矩阵:
m[,colSums(!is.na(m)) > 1]
注意:drop=FALSE
在这里是不必要的,因为没有可能被删除的维度。请参阅?[
或?drop
。您可以使用相同的来验证这一点:
现在进入循环。你会发现大量关于避免for循环和使用apply函数族的讨论。我怀疑你必须花一些时间来完成所有这些。但是,请注意,使用apply
——与一般的看法相反——在速度方面并不一定优于for
循环,因为它实际上只是一个fancy包装在for
循环中(检查源代码!)。但是,它在代码清晰性方面明显优于它,因为它紧凑且清楚它在做什么。因此,如果可能,请尝试使用apply
函数
为了重写您的循环,如果您可以口头
请描述您实际想要做什么,因为我假设
现在正在做的可能不是您想要的。Aswhich()
返回索引/posistion