Если вы хотите работать с другими направлениями, чем просто N
и S
, то вам нужно гнездо ifelse
или векторизованного версии настоящего Соглашения. Но векторизованный ifelse
недоступен. И слишком много вложенных ifelse
s являются субоптимальными.
Однако, вы также можете решить ее character
индексации следующим образом:
# Read in your data
dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
timestamp date winddir
1412877113 '09/10/2014 13:51' N
1412876508 '09/10/2014 13:41' S")
# Create a named vector of the degrees
tr <- c(N = 0, NE = 45, E = 90, SE = 135, S = 180, SW = 225, W = 270, NW = 315)
print(tr)
## N NE E SE S SW W NW
## 0 45 90 135 180 225 270 315
# We can then lookup the degrees with characters:
tr["E"]
## E
## 90
tr[c("NE", "SE")]
## NE SE
## 45 135
# Therefore, we can then use tr to look up the desired directions:
dat$wd <- tr[dat$winddir]
print(dat)
## timestamp date winddir wd
##1 1412877113 09/10/2014 13:51 N 0
##2 1412876508 09/10/2014 13:41 S 180
Убедитесь, что dat$winddir
является character
.
Это также должно работать с NE, SW и т. Д. Тривиально расширить это, например, 32 кардинальных точки NbE, NNE и т. д.
Edit: В качестве альтернативы, вы можете сохранить свой внешний вид в следующих эквивалентных способов:
dat <- within(dat, wd <- tr[winddir])
или как @agstudy предлагает:
dat <- transform(dat, wd = tr[winddir])