代码之家  ›  专栏  ›  技术社区  ›  rnorouzian

基于data.frame中的唯一id值捕获错误

  •  0
  • rnorouzian  · 技术社区  · 3 年前

    我想创建一个 stop() 对于我的data.frame下面这样对于每个 id ,如果 pos 是变化的(例如,由1、2等组成),则 mp 所属行的值 cont==TRUE

    这在R中可能吗?

    id == "B" 销售时点情报系统 mp公司 值(即,1,3),用于 cont==真 都不一样。

    dat <- data.frame(id = rep(c("A","B"),2:3), mp = c(1,5, 2,1,3), cont = c(F,T, F,T,T), pos = c(1,1, 1:3))
    #  id mp  cont pos
    #1  A  1 FALSE   1
    #2  A  5  TRUE   1
    #3  B  2 FALSE   1
    #4  B  1  TRUE   2
    #5  B  3  TRUE   3
    
    # Desired stop() message:
    "Error: 'B' has a wrong value."
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   akrun    3 年前

    base R split 数据的子集,即“cont”由“id”变为真 list . 然后再绕一圈 列表 names 列表 在里面 Map ,检查 if 这个 unique 行多于一行,则调用 stop

    lst1 <- split(dat[dat$cont,c("mp", "pos")], dat$id[dat$cont])
    Map(function(x, y) if(nrow(unique(x)) > 1)  
         stop(sprintf("'%s' has a wrong value.", y), call. = FALSE), 
            lst1, names(lst1))
    #Error: 'B' has a wrong value.
    

    使用更新的示例

    lst1 <- split(dat[dat$control, c("mpre", "post")], dat$study.name[dat$control])
    Map(function(x, y) if(all(lengths(lapply(x, unique))  > 1))  
          stop(dQuote(sprintf("'%s' has a wrong value.", y), FALSE), call. = FALSE), 
             lst1, names(lst1))
    #Error: "'Brown' has a wrong value."