【问题标题】:Writing a for loop to count every 3 scans as 1 scan编写一个 for 循环以将每 3 次扫描计为 1 次扫描
【发布时间】:2022-01-22 22:52:52
【问题描述】:

我的数据集在扫描中有几个目击/数据点,每个目击都按当前扫描编号列出。我希望能够编写一个代码,将扫描 1、2、3 计为扫描 1,将扫描 4、5、6 计为扫描 2,依此类推。

这是我目前的结果,包括我的尝试结果Sample dataset

一个小的数据框示例:

whales <- data.frame(rubbing.beach = c(away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach, away.from.beach), 
scan.no.1 = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 6))

我想将 scan.no.1 列设置为 scan.no 列。我使用下面的代码生成 scan.no 列,但这不是我想要的结果。

使用上面的 scan.no.1,我想要一个具有以下结果的 scan.no 列:

scan.no = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2).
scan.no=rep(NA, nrow(whales)); 
scan.no[1:3]=1; 
for (i in 3:(nrow(whales)-1)) {
  scan.no[i+1] = ifelse(whales$scan.no.1[i+1] != whales$scan.no.1[i], 
                        scan.no[i]+1, scan.no[i])
}

【问题讨论】:

    标签: r for-loop recursion


    【解决方案1】:

    这个怎么样

    scans <- 1:21
    scan_no <- ceiling(scans/3)
    scan_no
    #  [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7
    

    【讨论】:

    • 谢谢!它成功了。多么简洁的功能!
    【解决方案2】:

    你可以使用cut -

    scan.no.1 = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 6)
    
    cut(scan.no.1, seq(0, max(scan.no.1), 3), labels = FALSE)
    #[1] 1 1 1 1 1 1 2 2 2 2
    

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2021-12-10
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      相关资源
      最近更新 更多