【问题标题】:R: FOR-loop not working even though my (similar) WHILE-loop does workR:即使我的(类似的)WHILE 循环确实有效,FOR 循环也不起作用
【发布时间】:2021-07-30 11:46:22
【问题描述】:

我必须创建一个 for 循环来生成一个向量,该向量生成过去 24 小时内市值变化超过 10%(绝对值)的所有加密货币的符号。我已经制作了一个可以工作的while循环,但是我似乎无法弄清楚如何使for循环工作。有没有人知道为什么 for 循环不起作用?

我在下一个练习中遇到了同样的问题。我有一个有效的 while 循环,但我的 for 循环不起作用。为此,我们必须提供 3 种给定加密货币的市场数据。

以下是有关问题的所有代码。

第一个问题的代码:

for循环:

volatile <- vector()
i <- 1

for (i in nrow(mdata)) {
  if (abs(mdata[i, "market_cap_change_percentage_24h"]) >= 10) {
    volatile <- c(volatile, mdata[i, "symbol"])
  }
} 

while 循环:

volatile <- vector()
i <- 1

while(i <= nrow(mdata)) {
  if(abs(mdata[i, "market_cap_change_percentage_24h"]) >= 10) {
    volatile <- c(volatile, mdata[i, "symbol"])
  }
  i <- i + 1
}

第二题代码:

for循环:

coins <- c("polkadot","bitcoin","ethereum")
overview <- data.frame(id = character(0), average_daily_price = numeric(0), sd = numeric(0))
i <- 1

for (i in length(coins)) {
  mchart <- get_chart(coins[i])
  average_daily_price <- mean(mchart[, 2])
  sd <- sd(mchart[,2])
  overview <- rbind(overview, c(coins[i], average_daily_price, sd))
  i <- i + 1
}
colnames(overview) <- c("id", "average daily price", "sd")

(我已经尝试了带有和不带有“i

while 循环:

coins <- c("polkadot","bitcoin","ethereum")
overview <- data.frame(id = character(0), average_daily_price = numeric(0), sd = numeric(0))
i <- 1

while(i <= length(coins)) {
  mchart <- get_chart(coins[i])
  average_daily_price <- mean(mchart[, 2])
  sd <- sd(mchart[, 2])
  overview <- rbind(overview, c(coins[i], average_daily_price, sd)) 
  i <- i + 1
}
colnames(overview) <- c("id", "average daily price", "sd")

(get_chart是我们r-project中已经提供的功能。如果有人想复现代码,请在r-project顶部使用下面的代码,如果没有,这部分可以跳过。)

options(scipen=999)
library(httr)
library(jsonlite)

get_market <- function(page) {
  Sys.sleep(2)
  url <- sprintf("https://api.coingecko.com/api/v3/coins/markets?vs_currency=EUR&page=%s",page)
  data <- as.data.frame(fromJSON(content(GET(url), as="text"), flatten = TRUE))
  return(data)
}

get_chart <- function(coin_id) {
  Sys.sleep(2)
  url <- sprintf("https://api.coingecko.com/api/v3/coins/%s/market_chart?vs_currency=EUR&days=30&interval=daily",coin_id)
  data <- as.data.frame(fromJSON(content(GET(url), as="text"), flatten = TRUE))
  return(data)
}

mdata <- data.frame()

for (i in 1:5) {
  mdata <- rbind(mdata,get_market(i))
}

【问题讨论】:

    标签: r for-loop while-loop


    【解决方案1】:

    由于 R 是矢量化的,您通常根本不需要循环。例如,

    mtcars[mtcars$mpg > 28, 'disp']
    [1] 78.7 75.7 71.1 95.1
    

    对于您的第一个案例:

    volitile <- mdata[abs(mdata$market_cap_change_percentage_24h >=
    10), 'symbol']
    

    应该可以。它提取通过测试的行并返回您感兴趣的列。

    【讨论】:

    • 感谢您的回复!它不能完全工作,所以我希望你能帮我解决它。如果我在 R 中输入它,它确实提供了过去 24 小时每日市值百分比变化超过 10% 的正确数量的加密货币,但是,由于它只返回“TRUE”或“FALSE”,它只返回 1 或 0。因此,每当出现“1”(大于 10%)时,符号列表中的第一个“符号”就会出现,它始终是比特币(因为它是按总市值分组的)。结果,我有一个包含 34 次“btc”的向量,而它应该包含 34 个不同的符号。你知道怎么解决吗?
    • 没关系。我注意到括号放在错误的位置,导致公式中断。支架首先放置在 10 之后,但是当将其更改为 24 小时之后它起作用了。非常感谢您帮助我!过去的情况: volatile = 10), 'symbol'] 现在情况如何: volatile = 10, 'symbol']
    【解决方案2】:

    你的'for'循环只有一个值,即

    for (i in nrow(mdata))...
    

    应该替换为

    for (i in 1:nrow(mdata))...
    

    【讨论】:

    • 是的,当然是的,天哪,我觉得自己很愚蠢,以至于我之前没有意识到,哈哈,最小的事情......谢谢你的帮助!
    猜你喜欢
    • 2016-01-18
    • 2018-06-12
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2011-05-11
    • 2014-10-15
    相关资源
    最近更新 更多