2015-04-27 2 views
1

Как скопировать данные из столбца и изменить его данные?Как скопировать и изменить формат данных?

Например, у меня есть эти данные ниже, и я хочу скопировать все данные в winddir в новые данные с именем wd, но я хочу изменить любой N (север) на 0 (0 градусов) и любой S (юг) 180 (180 градусов) и так далее,

timestamp date    winddir 
1 1412877113 09/10/2014 13:51 N 
2 1412876508 09/10/2014 13:41 S 

поэтому мои новые данные,

timestamp date    winddir wd 
1 1412877113 09/10/2014 13:51 N   0 
2 1412876508 09/10/2014 13:41 S   180 

моя рабочая линия, которая скопировать столбец (но я понятия не имею, как изменить свои данные)

dat$wd <- dat$winddir 

любые идеи?

ответ

2

Если вы хотите работать с другими направлениями, чем просто 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]) 
1

Например, используя ifelse:

dat <- transform(dat,wd= ifelse(windir=="N",0,180)