从 4 列创建一个卡方 table,并将 2 个值配对在一起,使一个依赖和另一个独立
Create a chi-square table from 4 columns and pair 2 of the values together to make one dependent and other indenpendent
下面有一个列列表。
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
我想做的是取最后四列,取是 Col_B、否 Col_B、是 Col_W 和否 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 or no)(Col_)(B or 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")])
chi^2 检验通常需要每个类别至少 5 个成员进行分析,因此我将 Fisher 精确检验作为备选方案。
下面有一个列列表。
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
我想做的是取最后四列,取是 Col_B、否 Col_B、是 Col_W 和否 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 or no)(Col_)(B or 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")])
chi^2 检验通常需要每个类别至少 5 个成员进行分析,因此我将 Fisher 精确检验作为备选方案。