For loop忽略我的第一个项目

时间:2013-03-12 01:09:04

标签: r

如果您能帮助我解决以下两个问题,我将非常感激:

  1. 下面的'for'循环忽略了我的第一个循环项。下面的代码只是我程序的一小部分。在这里,我使用函数'Grep'迭代对象'num'并循环'mySet',该函数标记mySet中的某些项。
  2. 'for'循环除了在'num'对象的第一个元素'0'之外有效。因此,它在mySet中找不到任何以'0'开头的项目。

    num <- c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100)
    mySet <- c("0.C.A", "2.C.A", "4.C.A", "6.C.A", "8.C.A", "10.C.A", "15.C.A", "20.C.A",
               "30.C.A", "40.C.A", "45.C.A", "50.C.A", "55.C.A", "60.C.A", "65.C.A", "70.C.A",
               "80.C.A", "85.C.A", "90.C.A", "92.C.A", "94.C.A", "96.C.A", "98.C.A", "100.C.A")
    varLoop <- c()
    Grep <- function(num)grep(paste("^" , num, "\\.", sep=""), mySet, value = TRUE)
    for(i in num){
        varLoop[i] <- Grep(i)
        print(varLoop[i])}
    
    1. 如果我按如下方式修改脚本,则第二个问题是输出和警告不完整。警告是:'要替换的项目数不是替换长度的倍数'。不完整的输出不包括以字母B
    2. 结尾的任何项目

      下面的脚本会产生问题:

      num <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), 2)
      mySet <- c("0.C.A", "2.C.A", "4.C.A", "6.C.A", "8.C.A", "10.C.A", "15.C.A", "20.C.A",
                 "30.C.A", "40.C.A", "45.C.A", "50.C.A", "55.C.A", "60.C.A", "65.C.A", "70.C.A",
                 "80.C.A", "85.C.A", "90.C.A", "92.C.A", "94.C.A", "96.C.A", "98.C.A", "100.C.A",
                 "0.C.B", "2.C.B", "4.C.B", "6.C.B", "8.C.B", "10.C.B", "15.C.B", "20.C.B",
                 "30.C.B", "40.C.B", "45.C.B", "50.C.B", "55.C.B", "60.C.B", "65.C.B", "70.C.B",
                 "80.C.B", "85.C.B", "90.C.B", "92.C.B", "94.C.B", "96.C.B", "98.C.B", "100.C.B")
      varLoop <- c()
      Grep <- function(num)grep(paste("^" , num, "\\.", sep=""), mySet, value = TRUE)
      for(i in num){
          varLoop[i] <- Grep(i)
          print(varLoop[i])}
      

      提前谢谢你, Ragy Isaac

1 个答案:

答案 0 :(得分:8)

R中,索引从1而非0

开始
x <- 1:5
x[0] 
## integer(0)

习惯做法是做seq_along之类的事情,然后用结果索引num

你正在the second circle of R Hell在圈内成长你的对象。

我想在这里,sapply有助于简化您的代码

sapply(num, Grep)