是否有R函数将列包含到行数据中

时间:2019-07-31 22:36:21

标签: r dataframe

我想通过使用以下结构中的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

1 个答案:

答案 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 ")