【问题标题】:If statement in R combined with for [duplicate]如果 R 中的语句与 for [重复] 结合
【发布时间】:2020-05-18 23:53:51
【问题描述】:

我正在尝试在 R 中创建一个 if 语句。 这是我的起始表:

我尝试了以下方法,得出了一个合理的结果:

GSPC$GSPC.DIFF <- for( i in 1:length(GSPC$GSPC.Weekdaynr) ) {
    if( GSPC$GSPC.Weekdaynr[i] > 4 ) {
        GSPC.DIFF <- append(GSPC.DIFF,5)
    } else {
        GSPC.DIFF <- append(GSPC.DIFF, "")
    }
} 

但是将语句 1 更改为 append(GSPC.DIFF,GSPC$GSPC.Close)

GSPC$GSPC.DIFF <- for ( i in 1:length(GSPC$GSPC.Weekdaynr) ) {
    if ( GSPC$GSPC.Weekdaynr[i] > 4 ) {
        GSPC.DIFF <- append(GSPC.DIFF, GSPC$GSPC.Close)
    } else {
        GSPC.DIFF <- append(GSPC.DIFF, "")
    }
}

提供以下内容:

有人知道为什么它不像第一种情况那样每五行都赋予价值吗?

【问题讨论】:

  • 我认为您正在寻找的是一个简单的ifelse(),即ifelse(GSPC$GSPC.Weekdaynr[i] &gt; 4, GSPC$GSPC.Close, "")。那是你想要的吗?此外,人们将能够通过minimal reproducible example 更好地帮助您。特别是,如果您edit 您的问题包括dput(head(GSPC, 10)) 的输出而不是发布您的数据图片,您可以提供(至少一部分)您的数据,人们无法复制和粘贴这些图片以使用您的数据在他们自己的 R 会话中。
  • 谢谢,我没有得到想要的答案。我使用了这个公式 -> GSPC$GSPC 4, GSPC$GSPC.Test
  • 在 GSPC.Weekdaynr 5 的情况下应该说 0,在 4 的情况下应该说 1(由于某种原因两者都说 0) GSPC$GSPC 4, GSPC$GSPC.Test
  • 另外声明1应该是最终结果中的公式 = (DJI.Close - lag(DJI.Close))/lag(DJI.Close) * 100)

标签: r for-loop if-statement


【解决方案1】:

在 R 中很少需要显式的 for 循环。使用 for 循环并使用 append 在循环中增长向量将非常低效。

有很多方法可以做到这一点,@duckmayr 建议的一种简单方法是使用ifelse

例如,你可以这样做:

GSPC$GSPC.DIFF1 <- with(GSPC, ifelse(GSPC.Weekdaynr > 4,5, NA))
GSPC$GSPC.DIFF2 <- with(GSPC, ifelse(GSPC.Weekdaynr > 4,GSPC.Close, NA))

请注意,在您尝试不满足条件 (GSPC.Weekdaynr &gt; 4) 时,您返回的是一个空值 ("") 但在这里我返回 NA,因为一列只能有一个类,当您返回一个空值,它将所有数字更改为不能用于进一步处理的字符串,返回 NA 会将它们保留为数字。

【讨论】:

  • 顺利解决,谢谢:-)
  • 你知道为什么滞后函数在这个公式中没有按预期工作(这两个给出相同的结果 (GSPC.Close-lag(GSPC.Close, k =5)) )? GSPC$GSPC.Test 4,(GSPC.Close-lag(GSPC.Close, k =5))/lag(GSPC.Close, k =5)*100, NA ))
  • 不,抱歉,我不知道。也许,您可以为此提出新问题。
  • 会的,谢谢 :) 我检查了答案!
猜你喜欢
  • 2022-07-05
  • 2020-03-08
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2016-04-25
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多