将嵌套的'for'循环替换为基R中的嵌套lappy循环

将嵌套的'for'循环替换为基R中的嵌套lappy循环,r,dataframe,function,for-loop,lapply,R,Dataframe,Function,For Loop,Lapply,我想知道是否可以将我的for()循环替换为等效的*apply()系列 我试过lappy(),但没能成功。这在R基地是可能的吗 (dat <- data.frame(id=rep(c("A", "B"), c(2, 6)), mp=c(1, 5, 2, 1, 1, 1, 5, 6), sp=c(.2, .3, .2, .2, .2, .2, .6, .6), cont=c(F, T, F, F, T, T, T, T

我想知道是否可以将我的
for()
循环替换为等效的
*apply()
系列

我试过
lappy()
,但没能成功。这在R基地是可能的吗

(dat <- data.frame(id=rep(c("A", "B"), c(2, 6)), mp=c(1, 5, 2, 1, 1, 1, 5, 6), sp=c(.2, .3, .2, .2, .2, .2, .6, .6),
                  cont=c(F, T, F, F, T, T, T, T), pos=c(1, 1, rep(1:2, 3)),
                  out=c(1, 1, 1, 1, 1, 1, 2, 2)))

##### for loop:
for (x in split(dat, dat$id)) {
  pos_constant <- (length(unique(x$pos)) == 1)
  if (pos_constant) {
    next
  }
  group_out <- split(x,x$out)
  for (x_sub in group_out) {
    mps <- x_sub[x_sub$cont==TRUE,"mp"]
    sps <- x_sub[x_sub$cont==TRUE,"sp"]
    mps_constant <- length(unique(mps)) %in% c(1,0)
    sps_constant <- length(unique(sps)) %in% c(1,0)
    r <- !mps_constant || !sps_constant
    if (r) {
      stop(sprintf("'%s' has a wrong value.", x[,"id"][1]), call. = FALSE)
    }
  }
}

##### `lapply()` solution without success:
lapply(split(dat, dat$id), function(x){
  pos_constant <- (length(unique(x$pos)) == 1)
  if (pos_constant) {
  lapply(split(x, x$out), function(x_sub){
    mps <- x_sub[x_sub$cont==TRUE,"mp"]
    sps <- x_sub[x_sub$cont==TRUE,"sp"]
    mps_constant <- length(unique(mps)) %in% c(1,0)
    sps_constant <- length(unique(sps)) %in% c(1,0)
    r <- !mps_constant || !sps_constant
    if (r) {
      stop(sprintf("'%s' has a wrong value.", x[,"id"][1]), call. = FALSE)
    }
  }
 }
}
(dat类似的选项是

lapply(split(dat, dat$id), function(x){
  pos_constant <- (length(unique(x$pos)) == 1)
  if (!pos_constant) {
     lapply(split(x, x$out), function(x_sub){
      mps <- x_sub[x_sub$cont==TRUE,"mp"]
      sps <- x_sub[x_sub$cont==TRUE,"sp"]
       mps_constant <- length(unique(mps)) %in% c(1,0)
       sps_constant <- length(unique(sps)) %in% c(1,0)
       r <- !mps_constant || !sps_constant
      if (r) {
        stop(sprintf("'%s' has a wrong value.", x[,"id"][1]), call. = FALSE)
        }
           })
       }
      })
#Error: 'B' has a wrong value.

@rnorouzian是的,这是可能的,但在执行
停止后,不会有任何新ID的消息?正确吗behavior@rnorouzian但是,一旦某个特定元素对stop为TRUE,它就会停止everything@rnorouzian以下内容是否适用于您更新的BAE在代码中,我们按“id”和消息进行拆分,我们仅选择单个“id”,即
x[,“id”][1]
@rnorouzian if/else循环位于id的每个唯一拆分中。此外,它位于嵌套的inner lappy之外
lapply(split(dat, dat$id), function(x){
                      pos_constant <- (length(unique(x$pos)) == 1)
                      if (!pos_constant) {
                         lapply(split(x, x$out), function(x_sub){
                          mps <- x_sub[x_sub$cont==TRUE,"mp"]
                          sps <- x_sub[x_sub$cont==TRUE,"sp"]
                           mps_constant <- length(unique(mps)) %in% c(1,0)
                           sps_constant <- length(unique(sps)) %in% c(1,0)
                           r <- !mps_constant || !sps_constant
                          if (r) {
                            stop(sprintf("'%s' has a wrong value.", 
                              x[,"id"][1]), call. = FALSE)
                            } 
                               })
                           } else {
                         message(sprintf("'%s' is ok.", x[,"id"][1]))
                   
                            }
                          })
#'A' is ok.
#Error: 'B' has a wrong value.