For循环和if语句r+;预分配

For循环和if语句r+;预分配,r,if-statement,for-loop,R,If Statement,For Loop,如果EA$相位中的值为1,则新矢量OCC中的等效位置必须为90。到目前为止,我有: head(EA$phase) [1] 1 1 1 1 2 2 OCC <- vector(mode = "list", length = 580) #Pre-allocate OCC for(i in 1:length(EA$phase)) # For each element in EA$phase { if (EA$phase[i]=="1"){OCC[i]=90} #If the value o

如果EA$相位中的值为1,则新矢量OCC中的等效位置必须为90。到目前为止,我有:

head(EA$phase)
[1] 1 1 1 1 2 2

OCC <- vector(mode = "list", length = 580) #Pre-allocate OCC
for(i in 1:length(EA$phase)) # For each element in EA$phase
{
  if (EA$phase[i]=="1"){OCC[i]=90} #If the value of EA$phase[1] is 1 then OCC[1]=90
  if (EA$phase[i]=="2"){OCC[i]=90}
  if (EA$phase[i]=="3"){OCC[i]=50}
  if (EA$phase[i]=="4"){OCC[i]=70}
  if (EA$phase[i]=="5"){OCC[i]=60}
  if (EA$phase[i]=="6"){OCC[i]=50}
  if (EA$phase[i]=="7"){OCC[i]=70}
  if (EA$phase[i]=="8"){OCC[i]=70}
  if (EA$phase[i]=="9"){OCC[i]=80}
  if (EA$phase[i]=="10"){OCC[i]=80}
}
head(EA$阶段)
[1] 1 1 1 1 2 2

OCC您可以不使用for循环(也不需要预分配):


occ您可以不用for循环(也不用预分配):

occ试试看:

数据表
EA_DT尝试一下:

数据表
EA_DT
EA$phase
在您的示例中有整数(不是字符)。因此,您必须比较
if(EA$phase[i]==1).
等等。尝试创建一个类似
data的查找表。表(V1=c(1,2,3,…),V2=c(90,90,50,…)
然后通过
V1
EA$phase
将其合并为整数(而非字符)。因此,您必须比较
if(EA$phase[i]==1).
等等。尝试制作一个类似
data.table(V1=c(1,2,3,…),V2=c(90,90,50,…)
的查找表,然后通过
V1
EA$phase
将其合并。非常感谢您为我回答这个问题,我非常感谢。看起来有很多方法可以做到这一点(我从不感到惊讶,但总是感到惊讶)。我将接受jogo的解决方案,因为尽管我(作为r的新手)发现这两种方法都很有效,但我欣赏这两行的简洁性。一点问题也没有,请记住,使用@jogo解决方案时,
occ
向量需要与最高相位一样长,即即使给定单个
EA$相位
equal 100
occ
也需要100个元素长,因为
EA$相位==100
将提取occ[100]元素。。。。使用查找表,您可以轻松完成:
EA_-DF或:
EA_-DF非常感谢您为我回答这个问题,我非常感谢。看起来有很多方法可以做到这一点(我从不感到惊讶,但总是感到惊讶)。我将接受jogo的解决方案,因为尽管我(作为r的新手)发现这两种方法都很有效,但我欣赏这两行的简洁性。一点问题也没有,请记住,使用@jogo解决方案时,
occ
向量需要与最高相位一样长,即即使给定单个
EA$相位
equal 100
occ
也需要100个元素长,因为
EA$相位==100
将提取occ[100]元素。。。。使用查找表,您可以轻松完成:
EA_-DF或:
EA_-DF谢谢您为我回答这个问题,我非常感谢。此外,我真的很欣赏简单解决方案的美妙之处,这正是我所希望的。你能为我澄清一下第二阶段到底发生了什么吗?我知道它是有效的,但我还不知道机制(目前):-)让我来做:)让我们假设
EA$phase[1]
=3和
EA$phase[2]
=5,假设
occ[EA$phase]
会给你occ的第三和第五个元素,因为事实上你会告诉R给你
occ[3]
occ[5]
。感谢您为我回答这个问题,我非常感谢。此外,我真的很欣赏简单解决方案的美妙之处,这正是我所希望的。你能为我澄清一下第二阶段到底发生了什么吗?我知道它是有效的,但我还不知道机制(目前):-)让我来做:)让我们假设
EA$phase[1]
=3和
EA$phase[2]
=5,假设
occ[EA$phase]
会给你occ的第三和第五个元素,因为事实上你会告诉R给你
occ[3]
occ[5]
occ <- c(90, 90, 50, 70, 60,  50, 70, 70, 80, 80)
OCC <- occ[EA$phase]
EA$OCC <- occ[EA$phase]
EA_DT <- data.table(phase = c(1,2,1,2,1,3,7,5))

lookup_DT <- data.table(V1 = c(1,2,3,4,5,6,7), V2 = c(90,90,50,70,60,50,70))
res1 <- merge(EA_DT, lookup_DT, by.x = "phase", by.y = "V1")

lookup_DT2 <- data.table(phase = c(1,2,3,4,5,6,7), OCC = c(90,90,50,70,60,50,70))
setkey(EA_DT, phase)
res2 <- merge(EA_DT, lookup_DT2)
res3 <- EA_DT[lookup_DT, on = c(phase = "V1"), nomatch = 0L]
setkey(EA_DT, phase)
res4 <- EA_DT[lookup_DT2, nomatch = 0L]
EA_DF <- data.frame(phase = c(1,2,1,2,1,3,7,5))

lookup_DF <- data.frame(V1 = c(1,2,3,4,5,6,7), V2 = c(90,90,50,70,60,50,70))
res5 <- merge(EA_DF, lookup_DF, by.x = "phase", by.y = "V1")  

lookup_DF2 <- data.frame(phase = c(1,2,3,4,5,6,7), OCC = c(90,90,50,70,60,50,70))
res6 <- merge(EA_DF, lookup_DF2)