Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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
根据data.frame中的唯一id值捕获错误_R_Dataframe_Function_Error Handling - Fatal编程技术网

根据data.frame中的唯一id值捕获错误

根据data.frame中的唯一id值捕获错误,r,dataframe,function,error-handling,R,Dataframe,Function,Error Handling,我想为下面的data.frame创建一个stop(),这样对于每个唯一的id,如果pos是变化的(例如,由1s、2s等组成),那么,如果mp行的cont==TRUE值不相同,我们应该抛出一个错误 这在R中可能吗 在下面的玩具示例中,id==“B”应该抛出一个错误,因为pos是变化的(1,2,3),并且mp值(即1,3)对于cont==TRUE不相同的行 dat <- data.frame(id = rep(c("A","B"),2:3), mp =

我想为下面的data.frame创建一个
stop()
,这样对于每个唯一的
id
,如果
pos
是变化的(例如,由1s、2s等组成),那么,如果
mp
行的
cont==TRUE
值不相同,我们应该抛出一个错误

这在R中可能吗

在下面的玩具示例中,
id==“B”
应该抛出一个错误,因为
pos
是变化的(1,2,3),并且
mp
值(即1,3)对于
cont==TRUE
不相同的行

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."

dat在
base R
中,一个选项是
数据子集拆分,即通过“id”将“cont”设置为TRUE,并将其拆分为一个
列表
。然后将
列表
映射
列表
名称一起循环,检查
如果
唯一
行超过1行,则调用
停止

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)
停止(sprintf(“%s”有一个错误的值。”,y),call.=FALSE),
lst1,名称(lst1))
#错误:“B”的值错误。

使用更新的示例

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."
lst1))
stop(dQuote(sprintf(“%s”有一个错误的值),y),FALSE),call.=FALSE),
lst1,名称(lst1))
#错误:“'Brown'的值错误。”

@rnorouzian您能测试一下我更新的解决方案吗。同时检查
lst1[[“Brown”]
@rnorouzian请注意
stop
将在该问题首次出现时执行并抛出错误。它不会向您显示所有存在问题的ID,可能会引起您的兴趣。它已经被接受