Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带for循环的ifelse_R_Matrix - Fatal编程技术网

带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
函数

为了重写您的循环,如果您可以口头 请描述您实际想要做什么,因为我假设 现在所做的可能不是您想要的。As
which()
返回向量或矩阵中元素的索引/位置 我们要做的是:

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
函数

为了重写您的循环,如果您可以口头 请描述您实际想要做什么,因为我假设 现在正在做的可能不是您想要的。As
which()
返回索引/posistion