我正在为我的数据集"识别"编写一个 for 循环,其中每个迭代都依赖于以前的迭代。我想要这样
- 如果以前的迭代在 male.year 中没有与当前迭代在 male.previousyear 中的值相同,则 malerematingstatusb = 0 如果任何先前的迭代在"male.year"中的值与当前迭代
- 在"male.previousyear"中的值相同,并且该迭代在"pair"中的值也与当前迭代相同,则"malerematingstatusb" = 1 如果任何先前的迭代在"male.year"中的值与当前迭代在">
- male.previousyear"中的值相同,并且该迭代在"pair"中的值与当前迭代的值不同,并且该迭代的放置日期为<=当前迭代的"last.seen.female"列中的值,则malerematingstatusb = 2 如果任何先前的迭代在"male.year"中的值与当前迭代在">
- male.previousyear"中的值相同,并且该迭代在"pair"中的值与当前迭代的值不同,并且该迭代的铺设日期>当前迭代的"last.seen.female"列中的值,则malerematingstatusb = 3
这是我正在使用的代码:
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。这让我认为尝试让代码查看以前的迭代值是一个问题,<=当前迭代值。我已经检查过了,"layingdate"和"last.seen.female"都是数字形式。
我尝试将"last.seen.female"前面的符号更改为 == 和 !=,似乎它只是在"last.seen.female"[1:i-1] 中搜索"layingdate"[i] 的值,但搜索所有以前的迭代,而不仅仅是它应该查看的子集中的迭代。不知道这是为什么。有什么帮助吗?
我想你可能混淆了两个变量的迭代次数:
identified$layingdate[i]
--> identified$layingdate[1:i-1]
identified$last.seen.female[1:i-1]
--> identified$last.seen.female[i]
.
我找到了答案,通过丢失"子集"函数并使用 [] 代替它似乎有效:
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)))) }