【问题标题】:Error creating a vector from a self-made function从自制函数创建向量时出错
【发布时间】:2019-11-09 09:23:49
【问题描述】:

为了让我的问题可重现,我有以下向量:

trialvector <- as.vector(c("K", "K", "m", "m", "K"))

这个函数试图将这个向量转换为一个将“K”转换为数字 3 和“m”转换为数字 6 的函数,我想将此向量分配给一个名为 multiplier 的变量:

 Expcalc <- function(vector)  {
 multiplier <<- vector(mode = "numeric", length = length(vector))
 for (i in seq_along(vector)) {
   if (vector[i] == "K") {
     multiplier[i] <- 3
   } else if (vector[i] == "M" | i == "m") {
     multiplier[i] <- 6
   } else {
     multiplier[i] <- 0
   }
 }
}

我没有得到我想要的输出(一个 6 和/或 3 的向量,具体取决于 trialvector 中的哪个字符,我得到一个全零的向量。这个错误:

警告信息: 1:在 Expcalc(trialvector) 中:强制引入的 NA 2:在 Expcalc(trialvector) 中:强制引入的 NAs

我做错了什么?

【问题讨论】:

  • 使用矢量化的ifelse,不需要循环。类似ifelse(trialvector == 'k', 3, ifelse(trialvector == 'm', 6, NA)) 或使用factor,即factor(trialvector, levels = c('K', 'm'), labels = c(3, 6)) 或花哨的chartr,即chartr('Km', '36', trialvector)
  • 问题是在我的原始向量中我有大约 70 个级别,并且在 factor() 函数中建立 70 个标签是不可行的。我还需要类似于else 的东西来收集我想要零的所有情况。
  • 我给了你 3 个选项。选择你最喜欢的:)

标签: r function if-statement


【解决方案1】:
trialvector <- as.vector(c("K", "K", "m", "m", "K"))

trailvector
[1] "K" "K" "m" "m" "K"
Expcalc <- function(vector)  {
  multiplier <- as.vector(x = c(), mode = "numeric")
  for (i in vector) {
    if (i == "K") {
      multiplier <- append(multiplier, 3)
    } else if (i == "M" | i == "m") {

      multiplier <- append(multiplier, 6)
    } else {

      multiplier <- append(multiplier, 0)
    }
  }
  return(multiplier)
}

trailvector <- Expcalc(trialvector)


trailvector
[1] 3 3 6 6 3

我切换了 for 循环,然后将新值附加到新向量中。输出与您要查找的内容相匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多