【问题标题】:Question regarding using function c() in R coding关于在 R 编码中使用函数 c() 的问题
【发布时间】:2020-02-06 00:32:47
【问题描述】:

我正在学习数据分析,我的老师在课堂上提出了一个问题“使用 one-sigma 查找向量 D 中的任何异常值”。他给出了如下答案,但我不明白为什么他在使用函数“for”之前调用 Out=c() 并在函数 c(Out,o) 中再次调用“Out”?你能帮我回答这个问题吗?谢谢!

D=c(4,6,1,2,8,11)  
xbar=mean(D)  
std=sd(D)  
L=xbar-std  
U=xbar+std
Out=c()
for(j in 1:length(D)){
if(D[j]<L | D[j]>U) {o=D[j]} else{o=NULL}  Out=c(Out,o)}

【问题讨论】:

  • 有关c() 的帮助,请在控制台中输入?c。它说c() 是一个将值组合成向量或列表的函数。通常,括号内有多个元素,例如c(1, 2, 10)。如果它们是空的,就像这里一样,它相当于写Out = NULL,这意味着创建了一个名为Out 的对象,但是它是空的。最后两行中的循环逐渐向其中添加其他元素,因此它从没有元素(空)增长到一个元素,到两个,到三个等等。
  • @JonSpring,请将此作为答案发布!
  • FWIW 这段代码很容易理解,但不是如何在 R 中编码的一个很好的模型...outliers &lt;- D[abs(scale(D))&gt;1] 可以解决同样的问题...
  • @JonSpring 在这种情况下,我们是否需要命名匹配的对象?例如:Out1=c()Out=c(Out1,o)

标签: r function vector


【解决方案1】:

Out=c() 是你的输出。一开始它只是一个空的数据框。 for 循环在 length D 中迭代 j。因此,对于每个j 观察,它都会执行条件语句if(D[j]&lt;L | D[j]&gt;U) {o=D[j]} else{o=NULL},然后将结果放入输出Out 希望这会有所帮助。

【讨论】:

  • 这个我可以理解,但是当我们把 Out 再次放入函数 Out=c(Out,o)???
【解决方案2】:

在进入for 循环之前需要一个名为Out 的对象,这是基于c[&lt;- 函数的设计方式。它们需要名称存在于 R 解释器维护的对象表中,您使用了“=”,但在该上下文中,它实际上是 &lt;- 函数,即正在使用的赋值运算符。问题中的代码似乎没有使用该运算符,但实际上是在使用 Out=c(Out,o) 中的“=”符号时调用的。您不能通过附加到分配的 LHS 上的 Out 来为其分配值,因为 RHS 中的 Out 在 R 数据对象列表中还没有值(甚至不是长度为 0 的值)当c-函数试图访问它的值时。

&lt;- 运算符实际上是一个伪装成中缀运算符的函数。您可以通过以下方式证明这一点:

`<-`(my.out , 4)

> my.out
[1] 4

它还有一个索引赋值版本[&lt;-,它要求 LHS 上的命名对象存在。这是 for 循环用户的另一个错误来源。如果在循环运行时给[&lt;- 的命名LHS 对象不存在,那么第一次通过循环你会得到错误:

rm(my.out2)  #make sure it doesn't exist
for (i in 1:10) { my.out2[i] <- 4 }  # LHS doesn't exist, but RHS value exists
#Error: object 'my.out2' not found

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多