如何复制和更改数据格式?

时间:2015-04-27 17:42:02

标签: r

如何从列中复制数据并更改其数据?

例如,我在下面有这些数据,我想将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 个答案:

答案 0 :(得分:2)

如果您希望它与NS之外的其他方向一起使用,那么您需要嵌套ifelse或其矢量化版本。但是矢量化的ifelse并不容易获得。而且嵌套的ifelse太多是不理想的。

但是,你也可以通过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$winddircharacter

这也适用于NE,SW等。将其扩展到例如,这是微不足道的。 32个基点NbE,NNE等。

修改:或者,您可以按照以下等效方式保存您的查询:

dat <- within(dat, wd <- tr[winddir])

或者像@agstudy建议:

dat <- transform(dat, wd = tr[winddir])

答案 1 :(得分:1)

例如使用ifelse

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