我一直坚持这个问题一段时间,没有在网上找到任何帮助。
我有两个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向量。
希望你能看到我不喜欢的东西,因为我不想因为时间消耗而使用循环 - 如果你需要更多信息,请告诉我:))
谢谢!
答案 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)]