按矢量值获取列号 - R.

时间:2015-10-11 19:43:40

标签: r matrix match multiple-columns

我一直坚持这个问题一段时间,没有在网上找到任何帮助。

我有两个1.314.000个条目的矢量,一个表示风速,一个表示风向(当方向合并为12个方向时,值为1-12)。 我还有一个50001行和13列的矩阵,表示在给定风速(第1列)和风向(第2-13列)下涡轮机的发电量

计算电力生产似乎很明显:

PowerkWh <- PCC[ws*1000+1,1+wd]

PCC是50001x13矩阵,ws和wd是风速和风向变量。请注意,我不使用匹配因为某种原因导致NA。

ws,wd和PCC负责人:

WS:

[1]  2.327 16.971  3.469 23.558  7.882 10.619

WD:

[1]  5 10 10  9  1  1

PCC:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] 0.000    0    0    0    0    0    0    0    0     0     0     0     0     
[2,] 0.001    0    0    0    0    0    0    0    0     0     0     0     0     
[3,] 0.002    0    0    0    0    0    0    0    0     0     0     0     0     
[4,] 0.003    0    0    0    0    0    0    0    0     0     0     0     0     
[5,] 0.004    0    0    0    0    0    0    0    0     0     0     0     0     
[6,] 0.005    0    0    0    0    0    0    0    0     0     0     0     0    

请注意,PCC为0,因为风速通常仅在风速高于3.5 m / s时开启

此代码可以很好地获得正确的行(设置一个恒定的列/方向,比如5),但是我的问题是在给定wd中的风向时获取相应的列。 R简单地输出已经达到它的记忆,因为它将它解释为1.314.000x1.314.000矩阵 - 我期望从给定的风速和风向产生1.314.000向量。

希望你能看到我不喜欢的东西,因为我不想因为时间消耗而使用循环 - 如果你需要更多信息,请告诉我:))

谢谢!

2 个答案:

答案 0 :(得分:2)

我的回答假设ws中风速的相同单位是PCC第一列中的单位。

# ===============================
# = Quick Options for Fake Data =
# ===============================
n.dir <- 12 # number of wind directions
n.sample <- 50 # number of samples in the vectors

# ================================
# = Create Fake Data for Example =
# ================================
# create fake vectors and lookup tables
ws <- rlnorm(n.sample) # wind speeds
wd <- sample(1:n.dir, n.sample, replace=T) # wind directions
PCC <- matrix( # empty lookup table for power
    data=NA, 
    nrow=length(unique(ceiling(ws)))+1,
    ncol=length(wd)+1
)
# note the +1 is so that the top row of PCC
# references values that are closest to 0;
# i.e., the starting row of the lookup matrix
# references the lowest possible wind speed

# generate fake power values; 
# absolute values to make realistic
# data are also sorted so that more wind is more power
# beyond that, it is not realistic
dataExprsn <- expression(sort(abs(rnorm(nrow(PCC)))))
PCC[] <- replicate(ncol(PCC), eval(dataExprsn))
PCC[,1] <- c(0,sort(unique(ceiling(ws))))

# =============================
# = Approach to be Used by OP =
# =============================
power <- rep(NA, length=length(ws)) # to store output
for(i in 1:n.dir){ # do it by direction to save time
    t.index <- wd==i
    t.fun <- approxfun(x=PCC[,1], y=PCC[,i+1])
    power[t.index] <- t.fun(ws[t.index])

}

# ==============
# = The Answer =
# ==============
power

答案 1 :(得分:2)

您可以尝试 - 如果PCC的第一列包含ws的所有元素:

PCC[cbind(which(PCC[,1] %in% ws), wd + 1)]