Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免R编程中的FOR循环_R_For Loop - Fatal编程技术网

避免R编程中的FOR循环

避免R编程中的FOR循环,r,for-loop,R,For Loop,我在下面有两个数据帧 col1_x <- c(0123,123,234,4567,77789,4578,45588,669887,7887,5547) col2_x <- c('X1','X8','X2','X55','C12','B11','Z1','SS12','D9','F55') a <- c(10,9,8,7,6,5,4,3,2,1) DF1 <- cbind(col1_x,col2_x,a) DF1 <- as.data.frame(DF1, st

我在下面有两个数据帧

col1_x <- c(0123,123,234,4567,77789,4578,45588,669887,7887,5547)
col2_x <- c('X1','X8','X2','X55','C12','B11','Z1','SS12','D9','F55')
a    <- c(10,9,8,7,6,5,4,3,2,1)
DF1 <- cbind(col1_x,col2_x,a)
DF1 <- as.data.frame(DF1, stringsAsFactors = F)

col1_y <- c(012,123,56,55,78,5547)
col2_y <- c('X1','X8','S2','ER4','KL1','F55')
b    <- c(111,222,NA,NA,555,666)
DF2 <- cbind(col1_y,col2_y,b)
DF2 <- as.data.frame(DF2, stringsAsFactors = F)
请帮助我如何在不使用FOR循环的情况下修复此问题,因为迭代需要很多时间


注意:代码1满足我的要求

这就完成了代码1,没有警告

left_-join(DF1,DF2,by=c(“col1_x”=“col1_y”,“col2_x”=“col2_y”))%%
突变(a=结合(b,a))%>%
选择(-b)
#col1_x col2_x a
#1123x110
#2123x8222
#3234 X2 8
#44567x557
#5777789 C12 6
#64578 B11 5
#745588 Z1 4
#669887 SS12 3
#97887D92
#105547 F55666
如果我正确地解释了您需要的结果,那么这比使用
for
循环和
base::ifelse
(可以是)的任何实现都要快、高效、安全得多

要了解有关这样的合并和联接的更多信息,请参阅和。事实上,data-science-y任务的一部分是了解如何一致、安全、快速、高效地处理数据,并且。。。安全地。是的,我说了两遍。如果您的代码中有任何东西可能会混淆一个观察结果和另一个观察结果,那么您的所有结果和推论即使没有完全损坏,也充其量是有问题的。(我现在就要下车了。)


至于你的警告:

  • 条件的长度大于1…

    if
    语句需要一个长度为1的条件句点。长度不为0,长度不为2或更多。长度1。由于您的
    Y
    帧(实际上是现在的
    DF2
    )有超过1行,因此这是中断的

    这样想:
    如果(真),那么执行任务1
    是有意义的<代码>如果(真、假、假、真、假)执行任务1没有意义。该怎么办

    这里需要两件事中的一件:

    • 如果,则需要
      ,因此您应该查看以下选项之一:

      • any(is.na(Y$b))
      • all(is.na(Y$b))
        ;或
      • 其中一个特定的,例如
        是.na(Y$b[17])
        (如果至少有17个)
    • 您需要
      ifelse
      ,它可以处理逻辑向量。(我想不是这个。)

  • 较长的对象长度不是较短对象长度的倍数

    这似乎很清楚,但你不明白为什么会这样

    考虑以下问题:

    • c(1,2)==c(1,2)
      真的在问
      c(1==1,2==2)
      ,对吗?好
    • c(1,2)==1
      实际上是在问
      c(1==1,1==2)
      。好
    (这两个都不会出现在
    if
    语句中,顺便说一句:-)

    • c(1,2)==c(1,2,3,4)
      由于参数循环,在R中不是一个错误。我真的认为这应该是一个错误,因为很多时候它被使用/依赖,这是一个错误,结果被破坏/不正确。然而,这实际上产生了
      c(1==1,2==2,1==3,2==4)
      。是的,回收利用。虽然这不是警告/错误,但可能有用,但通常是一个无声的错误这仅在一个向量的长度是另一个向量长度的完美倍数时有效

    • c(1,2,9)==c(1,2,3,4,5)
      将尝试作为
      c(1==1,2==2,9==3,1==4,2==5)
      (并将给出相应的结果),但是。。。你不觉得这有点奇怪吗?好吧,这对你来说可能没问题,虽然这种回收方式可能有合法的用途,但它(以我的经验)在代码中往往是一个错误。如果你真的是这个意思,并且你真的知道这种类型的任意比较是你真正想要的,那么把它包装在
      suppressWarnings
      中,当你的数据结果似乎与输入不一致时,不要来找我

    通常,当出现问题时,人们应该考虑“设置操作”,而不是
    =
    ,因为他们需要%
    中的
    %。现在,想想这些:

    • c(1,2,9)%in%c(1,2,3,4,5)
      产生
      c(真、真、假)
      。(长度3,不是长度5。)你问的是
      c(“1:5是1吗?”,“2:1:5吗?”,“9:1:5吗?”)

  • 这在没有警告的情况下完成了代码1

    left_-join(DF1,DF2,by=c(“col1_x”=“col1_y”,“col2_x”=“col2_y”))%%
    突变(a=结合(b,a))%>%
    选择(-b)
    #col1_x col2_x a
    #1123x110
    #2123x8222
    #3234 X2 8
    #44567x557
    #5777789 C12 6
    #64578 B11 5
    #745588 Z1 4
    #669887 SS12 3
    #97887D92
    #105547 F55666
    
    如果我正确地解释了您需要的结果,那么这比使用
    for
    循环和
    base::ifelse
    (可以是)的任何实现都要快、高效、安全得多

    要了解有关这样的合并和联接的更多信息,请参阅和。事实上,data-science-y任务的一部分是了解如何一致、安全、快速、高效地处理数据,并且。。。安全地。是的,我说了两遍。如果您的代码中有任何东西可能会混淆一个观察结果和另一个观察结果,那么您的所有结果和推论即使没有完全损坏,也充其量是有问题的。(我现在就要下车了。)


    至于你的警告:

  • 条件的长度大于1…

    if
    语句需要一个长度为1的条件句点。长度不为0,长度不为2或更多。长度1。由于您的
    Y
    帧(实际上是现在的
    DF2
    )有超过1行,因此这是中断的

    这样想:
    如果(真),那么执行任务1
    是有意义的<代码>如果(真、假、假、真、假)执行任务1
    没有意义。该怎么办

    这里需要两件事中的一件:

    # code1 for (i in 1:nrow(DF2)) { if(is.na(DF2$b[i])) {} else { DF1 <-mutate(DF1, a = ifelse(col1_x == DF2$col1_y[i] & col2_x == DF2$col2_y[i], DF2$b[i],a) ) } } # code2 if(is.na(DF2$b)) {} else { DF1$a <- ifelse(DF1$col1_x == DF2$col1_y & DF1$col2_x == DF2$col2_y, DF2$b, DF1$a) }
    Warning messages:
    1: In if (is.na(Y$b)) { :
      the condition has length > 1 and only the first element will be used
    2: In X$col1 == Y$col1 :
      longer object length is not a multiple of shorter object length
    3: In X$col2 == Y$col2 :
      longer object length is not a multiple of shorter object length