当包含条件的列发生变化时执行测试 (R)

Perform a test when the column containing the condition varies (R)

我手头有一个数据集,其中一些问题的答案取决于之前提出的其他问题,并且需要在考虑这些问题的情况下执行聚合(例如:“difficultyX”需要“isdifficult”== 1,我必须计算 is.na(difficultyX) 知道条件成立)

问题是我有几列都满足不同的条件(X1 必须检查 Y1 列,x2 列 Y2 等...)

现在我尝试旋转 table 并将对应关系加入条件列和值,我的数据库如下所示:

after pivoting and joining

test<-tibble(Y1=1:3,Y2=1:3,var_to_test=c("x1","x2","x3"),condition=c("Y1","Y2","Y2"),value=c(1,2,2))

and I want the output to lok like this :


testoutput<-tibble(Y1=1:3,Y2=1:3,var_to_test=c("x1","x2","x3"),condition=c("Y1","Y2","Y2"),value=c(1,2,1),cond_verif=c(T,T,F))

现在我可以用

对一行执行我想要的测试
#this works
test[[1,test$condition[1]]]==test$value[1]

#this does not
test[[,test$condition]]==test$value

#this one takes awfully long (2 secs for 10K obs, in long format I have 700K of them)

for(i in 1:3){
    vec[i]<-test[[i,test$condition[i]]]==test$value[i]
 }

因此我正在寻找一个可以在合理时间内工作的概括,它可以与 map 函数、apply 函数、dplyr 甚至 base R 一起使用,但我还无法弄清楚...

感谢您的宝贵时间

library(dplyr)
library(tidyr)

test<-tibble(Y1=1:3,Y2=1:3,var_to_test=c("x1","x2","x3"),condition=c("Y1","Y2","Y2"),value=c(1,2,2))

可能的解决方案使用tidyr::pivot_longer

1.Bring 长格式数据,其中一列指定每个测试的(预期?)值。

2.Filter 未使用的行(test_condition 与应用的测试不匹配的行)

3.Compare 值并创建新列 cond_verif

test %>% 
  pivot_longer(col = c(Y1, Y2), names_to = "test_condition", values_to = "test_value") %>% 
  filter(condition == test_condition) %>% 
  mutate(cond_verif = value == test_value)

这个returns:

# A tibble: 3 x 6
  var_to_test condition value test_condition test_value cond_verif
  <chr>       <chr>     <dbl> <chr>               <int> <lgl>     
1 x1          Y1            1 Y1                      1 TRUE      
2 x2          Y2            2 Y2                      2 TRUE      
3 x3          Y2            2 Y2                      3 FALSE