创建一个虚拟矩阵,其中df中列的值放入矩阵中,其中值存在= 1,其余= NA或0

时间:2015-11-30 13:04:36

标签: r matrix

问题描述:

我有11640行的时间系列数据,其中每一行都是在某个特定小时测得的水位。 我需要一个代码,使我的列具有watertable值(我的数据集中某个列的名称是:" Watertable")并将其放入Matrix中的不同列。 " Watertable"中的列包含从0到超过100的深度值。我只对1到120厘米的值感兴趣。

我创建了具有相同行长度(即11640行)和120列的矩阵,其中每列代表表面下方的深度(例如,列35(名为X35)表面下方35厘米)(所有列名称均为1到1) 120在数字前面有一个X:X1,X2,X3,X4 ...... X119,X120)。 现在我想把我的价值观放在我的水资源" Watertable"进入我矩阵中的相应列。

实施例

如果" Watertable"某一行的值是58.我想让我的matrox中58和更高的所有列设置为1(而较低的列设置为NA或0)。 OBS!由于我的数据有十进制值,我想"四舍五入"如果.5和"向下舍入"如果< .5 ---> 50.56781 = 51和50.34369 = 50

" Watertable"数据:

> head(DATA1)
  DATE_TIME             Watertable
1 2014-06-14 00:00:00   50.80874
2 2014-06-14 01:00:00   50.04499
3 2014-06-14 02:00:00   50.02677
4 2014-06-14 03:00:00   51.01249
5 2014-06-14 04:00:00   51.04969
6 2014-06-14 05:00:00   51.56349   

我想要的是什么:

Date                   X1          ...          X50       X51     ...
2014-06-14 00:00:00    NA or 0     NA or 0      1         1       1
2014-06-14 01:00:00    NA or 0     NA or 0      1         1       1
2014-06-14 02:00:00    NA or 0     NA or 0      1         1       1
2014-06-14 03:00:00    NA or 0     NA or 0      NA or 0   1       1
2014-06-14 04:00:00    NA or 0     NA or 0      NA or 0   1       1
2014-06-14 05:00:00    NA or 0     NA or 0      NA or 0   NA or 0 1                        

我的矩阵中还有一个包含日期和时间的列,因为我认为我的代码中需要一个

我的矩阵代码:

WT_U_mtx= matrix(NA, nrow=11640, ncol=101, byrow=FALSE)
s= seq(from=0, to=100, by=1)
colnames(WT_U_mtx) = s
WT_U_mtx= as.data.frame(WT_U_mtx)
names(WT_U_mtx) <-  sub("", "X", names(WT_U_mtx))          
WT_U_mtx= cbind(WT_U_mtx, DATA[,"DATE_TIME"])

查看原始矩阵

  

tbl_df(WT_U_mtx)   资料来源:本地数据框[11,640 x 122]

      X0    X1    X2    X3    X4    X5    X6    X7    X8    X9    X10   X11  
1     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    
2     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    
3     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA        
4     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
5     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
6     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
7     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
8     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
9     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
10    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA      
 ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   
Variables not shown: X13 (lgl),X14 (lgl),X15 (lgl),X16 (lgl),X17 (lgl),
X18 (lgl), X19 (lgl), X20 (lgl), ..., X120 (lgl), DATA[, "DATE_TIME"] (time)

我的尝试:我实际上不知道如何编写代码,我一直在互联网上寻找各种问题(包括stackoverflow上的其他问题)。我想我想要某种&#34;如果&#34;功能。如果问题在结构上不清楚或不正确,我很抱歉,我是这个网页的新秀和整个Rstudio。

感谢我能得到的所有帮助! /艾琳

1 个答案:

答案 0 :(得分:0)

弥补数据:

dd <- read.csv(text="
time,water.table
2014-06-14 00:00:00,50.80874
2014-06-14 01:00:00,50.04499
2014-06-14 02:00:00,50.02677
2014-06-14 03:00:00,51.01249
2014-06-14 04:00:00,51.04969
2014-06-14 05:00:00,51.56349")
dd$time <- as.POSIXct(dd$time)

拼凑矩阵:

maxlen <- 120
r <- round(dd$water.table)
m <- sapply(r,function(x) rep(0:1,c(x-1,maxlen-x+1)))
m <- t(m)

检查:

dim(m) ## 6 120
apply(m==0,1,sum)  ## number of zeros in each row
## [1] 50 49 49 50 50 51

联合:

dd2 <- data.frame(dd,m)