r-从4列创建一个卡方表,并将其中的2个值配对在一起,使一个值为依赖值,另一个为独立值



下面有一个列列表。

col 1|col 2|col 3|col 4|col 5|Yes Col_B|No Col_B|Yes Col_W|No Col_W
1      1      3     3     5          7        9        3         2

我想做的是取最后四列,取Yes Col_B,No Col_B、Yes Col_W和No Col_W,然后将它们想象为两列

Yes or No| B or W
7       B
9       B
3       W
2       W

现在我有两个临时列,我可以运行chisquare来指示Yes或No是否依赖于B或W

test <- chisq.test(table(data$YesorNo, data$BorW)) 

首先,我们使用tidyr中的pivot_longer,并将其设置为为每列创建一个组(行(:

newdf = tidyr::pivot_longer(df[,6:9], cols=everything())

哪个给出:

name      value
1 Yes Col_B     7
2 No Col_B      9
3 Yes Col_W     3
4 No Col_W      2

现在,我们需要将name列分为两列,一列用于是或否,一列表示B或W。我们通过在这些名称(正则表达式(中找到一个模式来实现这一点:

模式是(yes或no((Col_((B或W(,我们将其写成"(Yes|No) Col_(B|W)"。然后,我们运行一个循环,为第一个组创建一列,其中组由括号设置(由"\1"给定(,为第二个组创建另一列("\2"(,并使用paste0("\",i)来执行此操作。

newdf = cbind(NA, NA, newdf) #Creating 2 empty columns
for(i in c(1,2)){
newdf[,i] = gsub("(Yes|No) Col_(B|W)",
paste0("\",i),
newdf$name)}
newdf$name = NULL #Getting rid of the name column
colnames(newdf) = c("Yes or No", "B or W", "Value")

输出:

Yes or No B or W Value
1       Yes      B     7
2        No      B     9
3       Yes      W     3
4        No      W     2

这是Ricardo的另一个版本,其中大部分名称拆分和分离都是在pivot_longer函数中完成的:

df<-data.frame(`Yes Col_B`=7, `No Col_B`=9, `Yes Col_W`=3, `No Col_W`=2) 
library(tidyr)
library(dplyr)
answer <- pivot_longer(df, contains("Col_"), names_sep = "_", names_to=c("Yes_No", ".value")) %>% 
mutate(Yes_No=str_replace(Yes_No, "\.Col", ""))
answer
## A tibble: 2 x 3
#  Yes_No     B     W
#  <chr>  <dbl> <dbl>
#1 Yes        7     3
#2 No         9     8
chisq.test(answer[ , c("B", "W")])
#since counts are less than 5 suggest the Fisher's Exact Test
fisher.test(answer[ , c("B", "W")])

卡^2检验通常每个类别至少需要5个成员进行分析,因此我将Fisher精确检验作为备选。

相关内容

最新更新