【问题标题】:find the reason I am getting zeros in a vector [closed]找到我在向量中得到零的原因[关闭]
【发布时间】:2021-05-21 21:41:42
【问题描述】:

我正在筛选数据集并希望将字符串值分配给整数。完成后,我在向量中得到一些等于 0 的值,但我不确定它们来自哪里。我正在取出这个变量的空白值的观察结果,并希望绘制其余的。有什么想法吗?

TexasMLSCounties=TexasMLSCounties[!TexasMLSCounties$X.2==" ",]

MLS=TexasMLSCounties$X.2
MLS=MLS[!TexasMLSCounties$X.2==""]
dput(MLS)
MLSNumber=integer(length=length(MLS))

for (i in 1:length(MLS)) {
  if(is.na(MLS))
    MLS=FALSE
  else{
    if(MLS[i]=="NTREIS")
      MLSNumber[i]=1
    else if(MLS[i]=="HARMLS")
      MLSNumber[i]=2
    else if(MLS[i]=="SABOR")
      MLSNumber[i]=3
    else if(MLS[i]=="ACTRIS")
      MLSNumber[i]=4 
    else if(MLS[i]=="CTXMLS")
      MLSNumber[i]=5
  }
  
}

dput(MLS)
c("MLS", "NTREIS", "HARMLS", "NTREIS", "SABOR", "HARMLS", "ACTRIS", 
"ACTRIS", "SABOR", "ACTRIS", "NTREIS", "HARMLS", "NTREIS", "ACTRIS", 
"ACTRIS", "NTREIS", "HARMLS", "NTREIS", "NTREIS", "NTREIS", "HARMLS", 
"ACTRIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "CTXMLS", 
"NTREIS", "NTREIS", "NTREIS", "NTREIS", "ACTRIS", "HARMLS", "NTREIS", 
"NTREIS", "SABOR", "HARMLS", "ACTRIS", "CTXMLS", "ACTRIS", "NTREIS", 
"ACTRIS", "NTREIS", "HARMLS", "NTREIS", "ACTRIS", "NTREIS", "NTREIS", 
"NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "SABOR", 
"NTREIS", "SABOR", "NTREIS", "ACTRIS", "SABOR?", "CTXMLS", "ACTRIS", 
"HARMLS", "NTREIS", "ACTRIS", "NTREIS", "SABOR", "HARMLS", "SABOR", 
"ACTRIS", "NTREIS", "HARMLS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", 
"HARMLS", "NTREIS", "CTXMLS", "NTREIS", "NTREIS", "ACTRIS?", 
"ACTRIS?", "ACTRIS?", "ACTRIS?", "NTREIS", "NTREIS", "NTREIS", 
"NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", "NTREIS", 
"ACTRIS", "HARMLS", "HARMLS", "NTREIS", "CTXMLS", "HARMLS", "HARMLS", 
"HARMLS", "NTREIS", "ACTRIS", "SABOR", "NTREIS", "NTREIS", "NTREIS"
)

【问题讨论】:

  • if 计算长度为 1 的逻辑向量。你正在传递它as.na(MLS)is.na 是一个向量化函数,因此它输出的逻辑向量长度与MLS 相同,我假设它的长度大于一。但是,if 仅评估该逻辑向量的第一个元素。
  • 它不是一个全零向量。我会改变我的问题,但我在向量中得到零
  • MLS=="MLS"时,你没有条件改变MLSNumber的值。由于您创建了一个全零向量,因此您只会替换您指定条件的那些零。如果你没有,它仍然是零。

标签: r for-loop if-statement


【解决方案1】:

错误来自MLS,一些值以问号结尾,"?"

unique(MLS)
#[1] "MLS"     "NTREIS"  "HARMLS"  "SABOR"   "ACTRIS" 
#[6] "CTXMLS"  "SABOR?"  "ACTRIS?"

一种解决方案是首先删除所有非字母字符。

MLS <- gsub("[^[:alpha:]]", "", MLS)
unique(MLS)
#[1] "MLS"    "NTREIS" "HARMLS" "SABOR"  "ACTRIS" "CTXMLS"

请注意,第一个值是"MLS",它与for 循环中的任何值都不匹配。

至于循环,还有更好的方法,下面是基于match的方法。

MLSNumber <- integer(length = length(MLS))

for (i in seq_along(MLS)) {
  if(MLS[i]=="NTREIS")
    MLSNumber[i]=1
  else if(MLS[i]=="HARMLS")
    MLSNumber[i]=2
  else if(MLS[i]=="SABOR")
    MLSNumber[i]=3
  else if(MLS[i]=="ACTRIS")
    MLSNumber[i]=4 
  else if(MLS[i]=="CTXMLS")
    MLSNumber[i]=5
}

而且更简单。

MLSNumber2 <- integer(length = length(MLS))    
MLSTable <- c("NTREIS", "HARMLS", "SABOR", "ACTRIS", "CTXMLS")
i <- match(MLS, MLSTable)
MLSNumber2[!is.na(i)] <- i[!is.na(i)]

比较结果:

all.equal(MLSNumber, MLSNumber2)
#[1] TRUE

【讨论】:

    【解决方案2】:

    MLSnumber 是一个零向量开始:

    MLSNumber=integer(length=length(MLS))
    
    MLSNumber
      [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     [46] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     [91] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    

    您正在循环访问MLS 的索引。您的第一个条件编码不正确,但我认为它应该是:

    if (is.na(MLS[i])) # correct
    if (is.na(MLS)) # incorrect
    

    if 计算长度为 one 的逻辑向量。你正在传递它as.na(MLS)is.na 是一个向量化函数,因此它输出的逻辑向量长度与MLS 相同。但是,if 仅评估该逻辑向量的第一个元素:

    if (is.na(c(F, NA, NA, NA)) {print("A")}
    Warning message:
    In if (is.na(c(F, NA, NA, NA))) { :
      the condition has length > 1 and only the first element will be used
    

    由于您的if 语句仅真正评估is.an(MLS[1]),因此该条件始终为FALSE,因为MLS[1] 不是NA。所以你的循环总是进入else 条件。

    在您的else 条件下,您遇到了@RuiBarradas 指出的几个问题。例如当i=1MLS[i]"MLS"。在这种情况下,您没有要做什么的条件。所以它退出你的if/else 子句。该索引的值在 MLSNumber 中从未更改,因此它保持为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-05
      • 2015-12-20
      • 1970-01-01
      • 2022-11-24
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多