2016-04-23 2 views
1

Если я хочу представить набор значений в R, которые связаны с тремя различными измерениями, есть ли простой/лаконичный способ его создания?Создать многомерное сопоставление данных в R

Скажем, например, у меня есть следующие ключи - каждое измерение должно поддерживать различное количество ключей. В общей сложности на примере ниже будет ссылаться на 360 значений (3 * 30 * 4):

rating <- c('AA','AAB','C') 
timeInYears <- 1:30 
monthsUntilStart <- c(1,3,6,12) 

Так что я хочу, чтобы иметь возможность доступа, например, значение с рейтингом АА, 7 лет с этого времени, начиная с в 12 месяцев, используя что-то вроде:

value <- data[rating=='AA',timeInYears==7,monthsUntilStart==12] 

для начала я хотел бы быть в состоянии предоставить образцы сгенерированные значения для каждой комбинации клавиш.

В действительности они будут считываться из базы данных, но для начала было бы полезно предоставить фиктивную структуру из набора фиктивных значений, которые можно просто последовательно повторять по структуре.

Так что у нас есть

values <- c(2.30,2.32,1.98,2.18,2.29,2.22) 

Таким образом, каждый (х, у, г) ключевые карты к одному из этих значений.

Любые подсказки или советы о том, как наилучшим образом подойти к этому высоко ценится!

Спасибо!

Phil.

+0

Обратите внимание, что в вашем примере вы не предоставляете достаточно значений, чтобы заполнить ваши 360 значений (3 * 30 * 4). Я приведу случайные значения в свой ответ ниже. – hatmatrix

+0

Да, это прекрасно - спасибо! в идеальном мире я бы циклировал ценности, которые я дал, но использование случайных значений на данный момент достаточно. – Phil

+0

Хорошо, пожалуйста, обратитесь к запрошенному. Кроме того, вы также можете использовать 'subset', если хотите продолжать использовать фрейм данных (добавлен раздел * edit *). – hatmatrix

ответ

3

Вы можете использовать массив в R для этой задачи.

Во-первых, мы создадим фрейм данных, который включает в себя все возможности. По желанию, мы будем присваивать значения, которые закрывались в длину наблюдений:

rating <- c('AA','AAB','C') 
timeInYears <- 1:30 
monthsUntilStart <- c(1,3,6,12) 

data <- expand.grid(rating=rating, timeInYears=timeInYears, monthsUntilStart=monthsUntilStart) 
data$value <- c(2.30,2.32,1.98,2.18,2.29,2.22) # cycles through 

Далее, мы преобразуем в массив:

dataarray <- unclass(by(data[["value"]], data[c("rating", "timeInYears", "monthsUntilStart")], identity)) 

Обратите внимание, что целые числа будут преобразованы в строки символов.

> dimnames(dataarray) 
$rating 
[1] "AA" "AAB" "C" 

$timeInYears 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" 
[16] "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" 

$monthsUntilStart 
[1] "1" "3" "6" "12" 

Вы можете получить доступ к нужному элементу по индексу (он возвращает случайное значение, назначенную для данного примера).

> dataarray["AA", "7", "12"] 
[1] 2.3 

Редактировать

Вы также можете просто использовать сам кадр данных, если вы хотите.

> subset(data, rating=='AA' & timeInYears==7 & monthsUntilStart==12) 

    rating timeInYears monthsUntilStart value 
289  AA   7    12 2.3 
> subset(data, rating=='AA' & timeInYears==7 & monthsUntilStart==12, value) 

    value 
289 2.3 
> subset(data, rating=='AA' & timeInYears==7 & monthsUntilStart==12)$value 
[1] 2.3 
Смежные вопросы