Sali
May 2, 2021, 1:57pm
1
Dear community,
I have a simple vector
my_coins <- c("eth","usdt","link","doge")
I'm trying to calculate a for-loop in combination with an if-statement :
for(i in 1:length(mdata$symbol)) {
if(mdata$symbol[i] == "eth" || "usdt" || "link" || "dodge"){
return(mdata$current_price[i])
}
}
but I keep getting the an error stating: Error in mdata$symbol[i] == "eth" || "usdt" :
invalid 'y' type in 'x || y'
Can someone please help me to fix this error?
If you want to evaluate if something appears within a vector or list of things, use the %in% operator.
Also r is a vectorised language , so the sort of code you are writing does not require for loops generally.
It seems you are using data.frames, learning tidyverse will likely bring you huge benefits.
1 Like
Sali:
dodge
doge
?
See the FAQ: How to do a minimal reproducible example reprex
for beginners ; don't make reverse-engineering data objects an obstacle to attracting questions.
The immediate problem is that logical operators (see help(logic)
These operators act on raw, logical and number-like vectors
As @nirgrahamuk notes, vectorizing in dplyr
is more fluid and succinct. It also returns a more useful object.
In using a for
loop, seq_along
is preferred over length and providing a "receiver" object avoids the surprise of receiving only the last value of [i]
.
my_coins <- c("eth","usdt","link","doge")
mdata <- data.frame(symbol = c("usdt","doge"), current_price = c(1,2))
mdata
#> symbol current_price
#> 1 usdt 1
#> 2 doge 2
result <- list()
for(i in seq_along(mdata))
if (mdata$symbol[i] %in% my_coins) result[i] = mdata$current_price[i]
unlist(result)
#> [1] 1 2
suppressPackageStartupMessages({
library(dplyr)
})
mdata %>% filter(symbol %in% my_coins)
#> symbol current_price
#> 1 usdt 1
#> 2 doge 2
system
Closed
May 23, 2021, 3:33pm
4
This topic was automatically closed 21 days after the last reply. New replies are no longer allowed. If you have a query related to it or one of the replies, start a new topic and refer back with a link.