【问题标题】:R Vector Values Overwrite in Function [closed]R向量值在函数中覆盖[关闭]
【发布时间】:2017-06-30 01:25:27
【问题描述】:

我正在解决的具体问题:

创建一个长度为 number-of-rows-of-iris-dataset 的字符向量,这样,每个元素都有一个字符值——如果相应的 'Sepal.Length' > 5,则“大于 5”,否则应该得到“小于 5”。

这行得通:

char_vect <- c(seq(1:nrow(iris)))

for (i in char_vect) {
  if (iris$Sepal.Length[i] > 5) {
    char_vect[i] <- ("greater than 5") } else {
      char_vect[i] <- ("less than 5")
    }
}

但由于某种原因,如果我将 char_vect 定义如下,我会得到有趣的响应:

char_vect <- iris$Sepal.Length

for (i in char_vect) {
  if (iris$Sepal.Length[i] > 5) {
    char_vect[i] <- ("greater than 5") } else {
      char_vect[i] <- ("less than 5")
    }
}

虽然我开始使用的向量在这两种情况下是不同的,但函数是相同的,并且会覆盖原始向量,所以只要它们的长度相等,它们的值不应该是不相关的吗?

当我查看第二个选项的输出时,我更加困惑,因为看起来有些函数覆盖了一些原始值,但不是全部......

我的直觉是,这与选项 1 将 char_vect 定义为整数而选项 2 是数字的事实有关?但我不明白为什么比较运算符不能在整数和数字上同样工作。查看选项 2 的输出,似乎还有该函数无法处理的整数。

非常感谢 R 新手!

【问题讨论】:

  • 另见ifelse函数。
  • i in char_vect: i 在第二种情况下不是数字索引,但您仍然像使用它一样使用它。
  • 谢谢大家,显然还有更多的东西要学 - 没有考虑过 char_vect btwn 索引的差异。选项 1 和 2

标签: r vector integer numeric overwrite


【解决方案1】:

您的第二个版本实际上没有意义。您可以通过像这样更改 for 循环的主体来看到这一点:

char_vect <- iris$Sepal.Length
for (i in char_vect) {
   cat(i, "\n")
}
5.1 
4.9 
4.7 
4.6 
5 
5.4 
...  Output truncated

这些是您输入iris$Sepal.Length[i]char_vect[i] 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多