for循环依赖于以前的迭代值不起作用

时间:2016-02-17 14:36:59

标签: r if-statement for-loop subset

我正在为我的数据集“已识别”编写一个for循环,其中每次迭代都依赖于之前的迭代。 我想要它

  1. 如果没有先前的迭代在male.year中具有与当前迭代在male.previousyear中相同的值,则malerematingstatusb = 0
  2. 如果任何先前的迭代在“male.year”中具有与当前迭代在“male.previousyear”中相同的值,并且该迭代在“对”中具有与当前迭代相同的值,则“malerematingstatusb”= 1
  3. 如果任何先前的迭代在“male.year”中具有与当前迭代在“male.previousyear”中所做的相同的值,并且该迭代在“对”中没有与当前迭代那样具有相同值且该迭代laydate是< =当前迭代的“last.seen.female”列中的值,malerematingstatusb = 2
  4. 如果任何先前的迭代在“male.year”中具有与当前迭代在“male.previousyear”中所做的相同的值,并且该迭代在“对”中没有与当前迭代那样具有相同值且该迭代laydate是>当前迭代的“last.seen.female”列中的值,malerematingstatusb = 3
  5. 这是我正在使用的代码:

    for(i in 1:length(identified$year)) {
    
      ifelse(
    (!(identified$male.previousyear[i] %in% identified$male.year[1:i-1])), 
    identified$malerematingstatusb[i] <- 0,
    ifelse(
      (nrow(subset((subset(identified, identified$male.previousyear[i] == identified$male.year[1:i-1],)), identified$pair[i] == identified$pair[1:i-1],)) > 0),
      identified$malerematingstatusb[i] <- 1, 
      ifelse(
      (nrow(subset((subset((subset(identified, identified$male.previousyear[i] == identified$male.year[1:i-1],)), identified$pair[i] != identified$pair[1:i-1],)), identified$layingdate[i] <= identified$last.seen.female[1:i-1],)) > 0),
        identified$malerematingstatusb[i] <- 2, 
         ifelse(
        (nrow(subset((subset((subset(identified, identified$male.previousyear[i] == identified$male.year[1:i-1],)), identified$pair[i] != identified$pair[1:i-1],)), identified$layingdate[i] > identified$last.seen.female[1:i-1],)) > 0),
          identified$malerematingstatusb[i] <- 3,
          identified$malerematingstatusb[i] <- NA)))) }
    

    这一切都有效,除了应该是3的所有值也是2.这使我认为在尝试使代码查看先前的迭代值是&lt; =当前迭代值时是一个问题。 我已经检查过,“laydate”和“last.seen.female”都是数字形式。

    我尝试改变“last.seen.female”前面的标志,例如到==和!=似乎它只是在“last.seen.female”[1:i-1]中搜索“layingdate”[i]的值,但是在所有先前的迭代中搜索而不仅仅是应该关注的子集中的那些。不知道为什么会这样。 有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

我认为你可能混淆了两个变量的迭代次数:

identified$layingdate[i] - &gt; identified$layingdate[1:i-1]

identified$last.seen.female[1:i-1] - &gt; identified$last.seen.female[i]

答案 1 :(得分:0)

我找到了答案,通过丢失“子集”函数并使用[]进行子集化而不是它似乎有效:

for(i in 1:length(identified$year)) {

  ifelse(
(!(identified$male.previousyear[i] %in% identified$male.year[1:i-1])), 
identified$malerematingstatusb[i] <- 0,
ifelse(
  (nrow(identified[(identified$male.previousyear[i] == identified$male.year[1:i-1]) & (identified$pair[i] == identified$pair[1:i-1]),]) > 0),
  identified$malerematingstatusb[i] <- 1, 
  ifelse(
  (nrow(identified[(identified$male.previousyear[i] == identified$male.year[1:i-1]) & (identified$pair[i] != identified$pair[1:i-1]) & (identified$layingdate[i] <= identified$last.seen.female[1:i-1]),]) > 0),
    identified$malerematingstatusb[i] <- 2, 
     ifelse(
    (nrow(identified[(identified$male.previousyear[i] == identified$male.year[1:i-1]) & (identified$pair[i] != identified$pair[1:i-1]) & (identified$layingdate[i] > identified$last.seen.female[1:i-1]),]) > 0),
      identified$malerematingstatusb[i] <- 3,
      identified$malerematingstatusb[i] <- NA)))) }