当包含条件的列发生变化时执行测试 (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
我手头有一个数据集,其中一些问题的答案取决于之前提出的其他问题,并且需要在考虑这些问题的情况下执行聚合(例如:“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