2015-01-02 2 views
2

Мне нужно создать набор данных, содержащий 20 наблюдений в 3 классах (20 наблюдений для каждого из классов - всего 60) с 50 переменными. Я попытался достичь этого, используя приведенный ниже код, однако он порождает ошибку, и я в итоге создаю 2 наблюдения из 50 переменных.Использование rnorm() для генерации наборов данных

data = matrix(rnorm(20*3), ncol = 50) 
Warning message: 
In matrix(rnorm(20 * 3), ncol = 50) : 
data length [60] is not a sub-multiple or multiple of the number of columns [50] 

Я хотел бы знать, где я неправильно, или даже если это самый лучший способ для создания набора данных, а также некоторые объяснения возможных решений, поэтому я могу лучше понять, как сделать это в будущем ,

ответ

3

Ниже, вероятно, может быть сделано менее чем мои 3 строк кода, но я хочу сохранить его простым, и я также хочу, чтобы использовать функцию matrix, с которым вы, кажется, знакомы:

#for the response variable y (60 values - 3 classes 1,2,3 - 20 observations per class) 
y <- rep(c(1,2,3),20) #could use sample instead if you want this to be random as in docendo's answer 

#for the matrix of variables x 
#you need a matrix of 50 variables i.e. 50 columns and 60 rows i.e. 60x50 dimensions (=3000 table cells) 
x <- matrix(rnorm(3000), ncol=50) 

#bind the 2 - y will be the first column 
mymatrix <- cbind(y,x) 

> dim(x) #60 rows , 50 columns 
[1] 60 50 
> dim(mymatrix) #60 rows, 51 columns after the addition of the y variable 
[1] 60 51 

Обновление

Я просто хотел быть более конкретным относительно ошибки, которую вы получите, когда попробуете matrix в своем вопросе.

  1. Прежде всего rnorm(20*3) идентичен rnorm(60), и он будет производить вектор 60 значений из стандартного нормального распределения.
  2. Когда вы используете matrix, он заполняет его значениями по столбцам, если не указано иное с аргументом byrow. Как сказано в документации:

If one of nrow or ncol is not given, an attempt is made to infer it from the length of data and the other parameter. If neither is given, a one-column matrix is returned.

И логический способ вывести это уравнением n * m = number_of_elements_in_matrix где n и m являются количество rows и columns матрицы соответственно. В вашем случае ваш number_of_elements_in_matrix равен 60, а номер столбца - 50. Следовательно, количество строк должно быть 60/50 = 1,2 строки. Однако десятичное число строк не имеет никакого смысла и, следовательно, вы получаете ошибку. Поскольку вы выбрали 50 столбцов, только кратные 50 будут приниматься как number_of_elements_in_matrix. Надеюсь, это ясно!

Смежные вопросы