R: Как преобразовать таблицу в векторы - PullRequest
3 голосов
/ 29 января 2012

Я работаю с примерами из Doing Bayesian Data Analysis Крушке и мне нужно немного помочь понять, как получить данные в формате, который требуется его примерам кода.В главе 22 у него есть таблица, подобная этой

         Blue  Brown  Green Hazel
Black    20    68     5     15
Blond    94    7      16    10
Brunette 84    119    29    54
Red      17    26     14    14

Мне удобно вводить таблицу в R, вводить ее в электронную таблицу и использовать read.table("clipboard", header=T, sep="\t") или вводить ее в R следующим образом

con.table2 <- matrix(c(20,68,5,15,94,7,16,10,84,119,29,54,17,26,14,14),nrow=4,byrow=TRUE)
dimnames(con.table2) <- list(c("Black","Blond","Brunette","Red"),c("Blue","Brown","Green","Hazel"))

Но в своем коде он представляет эту таблицу примерно так, готов к анализу (полный код здесь http://www.indiana.edu/~kruschke/DoingBayesianDataAnalysis/Programs/PoissonExponentialJagsSTZ.R)

Freq = c(68,119,26,7,20,84,17,94,15,54,14,10,5,29,14,16)
Eye = c("Brown","Brown","Brown","Brown","Blue","Blue","Blue","Blue","Hazel" # runs off the page of his book
Hair = c("Black","Brunette","Red","Blond","Black","Brunette","Red","Blond","Black" # runs off the page of his book

Похоже, таблица имеетбыл преобразован в три вектора. Какой самый эффективный способ сделать это? Я хотел бы заменить его данные своими собственными, поэтому было бы здорово узнать, как преобразовать данные в формат, необходимый для этого анализа.

Ответы [ 3 ]

7 голосов
/ 29 января 2012

Для этого я бы использовал melt() в пакете reshape2:

library(reshape2)
df <- melt(con.table2, varnames=c("Hair", "Eye"), value.name="Freq")

# df is a data frame, a list from which you can easily extract the
# component vectors "Hair", "Eye", and "Freq. 
# Try, for example:
str(df)
df$Hair    
4 голосов
/ 29 января 2012

В базе R есть метод для преобразования объектов класса "таблица" в data.frames.Причиной того, что она не удалась с вашей матрицей, является то, что вы не сказали R, что это таблица.Как только вы это сделаете, метод завершится успешно:

class(con.table2) <- "table"
as.data.frame(con.table2)
#-----------------------
       Var1  Var2 Freq
1     Black  Blue   20
2     Blond  Blue   94
3  Brunette  Blue   84
4       Red  Blue   17
5     Black Brown   68
6     Blond Brown    7
7  Brunette Brown  119
8       Red Brown   26
9     Black Green    5
10    Blond Green   16
11 Brunette Green   29
12      Red Green   14
13    Black Hazel   15
14    Blond Hazel   10
15 Brunette Hazel   54
16      Red Hazel   14

Предполагается, что класс «таблица» в R будет таблицей на случай непредвиденных обстоятельств (так же, как вы ее построили), т. Е. Класс с количеством в ячейках.В этом случае у вас могли бы быть дробные значения, и проблем не было бы, но некоторые методы, которые ожидали, что значения будут целочисленными, могли бы задушить нецелые значения.

2 голосов
/ 29 января 2012

Поскольку ваши данные представлены в виде матрицы с цветом волос в качестве имен строк, вы можете сначала преобразовать их в data.frame, а затем использовать melt для преобразования в высокий формат.

d <- data.frame(
  Hair = rownames(ch_22_table),
  as.data.frame( ch_22_table )
)
library(reshape2)
melt(d, id.vars="Hair", variable.name="Eye", value.name="Freq")
...