如何直接输入数据以生成表示列联表的data.frame?

时间:2012-10-30 00:48:46

标签: r contingency

我正在尝试将以下数据直接输入 R (代表列联表)

Area        School    Coffeshop    Hospitals    Parks    Totatl  
Washington     142          120           20       20       302   
Seattle        120          140           30       40       330 
Total          262          260           50       60       632

我的代码是:

n<-c("Area","School","Cofeeshop","Hospitals","Parks","Total") 
x<-c("Washington",142,120,20,20,302)
y<-c("Seattle",120,140,30,40,330)
z<-c("Total",262,260,50,60,631)
data<-cbind(n,x,y,z)
data<-data.frame(data)

2 个答案:

答案 0 :(得分:6)

您的代码中充满了基本的语法错误,请尝试直接从您使用的脚本中进行复制和粘贴。 (我真的希望你这里没有这样做过。)

如果在同一个向量中组合字符和数字变量,它将创建一个字符向量,这不是你想要的。

尝试类似

的内容
vec_names <-c("School", "Cofeeshop", "Hospitals", "Parks", "Total") 
Washington <- c(142, 120, 20, 20, 302)
Seattle<-c(120, 140, 30, 40, 330)
Total <-  c(262, 260, 50, 60, 631)

ctable <- rbind(Washington, Seattle, Total)
colnames(ctable) <- vec_names

# ctable is a matrix at the moment, with the rownames identifying 
# Washington etc

ctable_df <- data.frame(ctable)

# ctable_df is now a data.frame.
# if you want area as a column in your data.frame (not just row.names)
CTABLE <- data.frame(area= rownames(ctable_df), ctable_df, row.names = NULL)
CTABLE
        area School Cofeeshop Hospitals Parks Total
1 Washington    142       120        20    20   302
2    Seattle    120       140        30    40   330
3      Total    262       260        50    60   631

答案 1 :(得分:1)

使用tidyverse的Tribble (有关更多详细信息,请参见tidyverse tibble

install.packages("tidyverse")
library(tidyverse)
ctable <-
tribble(
  ~Area, ~School, ~Coffeeshop, ~Hospitals, ~Parks, ~Total,
  "Washington", 142, 120, 20, 20, 302,
  "Seattle", 120, 140, 30, 40, 330,
  "Total", 262, 260, 50, 60, 631
)
ctable
# A tibble: 3 x 6
  Area       School Coffeeshop Hospitals Parks Total
  <chr>       <dbl>      <dbl>     <dbl> <dbl> <dbl>
1 Washington    142        120        20    20   302
2 Seattle       120        140        30    40   330
3 Total         262        260        50    60   631