我想通过使用以下结构中的R通过转换来自csv文件的数据帧来在R中执行卡方检验
Observed Values East West North South
Males 50 142 131 70
Females 435 1523 1356 750
到
以下示例
Row Observed value Region
1 1 East
2 1 East
3 1 East
...
435 0 East
假设1 =男性。 0 =女性
我一直在尝试使用堆栈和数据框功能通过R创建新表。我需要下表在R中执行卡方检验。我正在尝试的代码如下:
Stacked_data <- stack(data)
library(dummies)
df1 <- data.frame(id = 1:0, Observed.Values )
df2 <- cbind(Stacked_data, dummy(df1$id, sep = "_"))
预期结果将包含2列(观察值和区域)。观测值将包含类别值,其中男性= 1,女性=0。区域将包含相应观测值的区域。
这样,当我执行
table(Region,Observed Values)
它将产生
Observed Values
Region 1 0
East 50 435
West 142 1523
North 131 1356
South 70 750
答案 0 :(得分:0)
更新:根据您的预期输出,您根本不需要太多。从下面使用obs
,获得输出(可以运行chisq.test
的所有操作)就是
obs2 <- t(obs[,-1])
dimnames(obs2) <- list(Region = rownames(obs2), Observed = c('0', '1'))
obs2
# Observed
# Region 0 1
# East 50 435
# West 142 1523
# North 131 1356
# South 70 750
但是,再说一次,如果您只需要对它们运行chisq.test
,则使用哪种方向都没关系:
### original frame you provided
chisq.test(obs[,-1])
# Pearson's Chi-squared test
# data: as.matrix(obs[, -1])
# X-squared = 1.5959, df = 3, p-value = 0.6603
### transposed/re-labeled frame
chisq.test(obs2)
# Pearson's Chi-squared test
# data: obs2
# X-squared = 1.5959, df = 3, p-value = 0.6603
没有区别。也许您只需要[,-1]
部分?
这是一种尝试,尽管我不知道这正是您所期望的。 (输入数据在此答案的底部。)
library(dplyr)
library(tidyr)
out1 <- obs %>%
gather(Region, v, -Observed) %>%
rowwise() %>%
do( tibble(Region = .$Region, Observed = rep(1L * (.$Observed == "Males"), .$v)) ) %>%
ungroup() %>%
mutate(Row = row_number())
out1
# # A tibble: 4,457 x 3
# Region Observed Row
# <chr> <int> <int>
# 1 East 1 1
# 2 East 1 2
# 3 East 1 3
# 4 East 1 4
# 5 East 1 5
# 6 East 1 6
# 7 East 1 7
# 8 East 1 8
# 9 East 1 9
# 10 East 1 10
# # ... with 4,447 more rows
我们可以验证它是可逆的
xtabs(~ Observed + Region, data = out1)
# Region
# Observed East North South West
# 0 435 1356 750 1523
# 1 50 131 70 142
(即使列和行与输入的顺序不同,数字也会匹配)。
数据:
obs <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Observed East West North South
Males 50 142 131 70
Females 435 1523 1356 750 ")