2010-10-12 2 views
5

Я программирую в R. У меня есть вектор, содержащий, скажем, 1000 значений. Теперь предположим, что я хочу разбить эти 1000 значений случайным образом на два новых набора, один из которых содержит 400 значений, а другой - 600. Как я могу это сделать? Я думал о делать что-то вроде этого ...Как разбить набор значений (вектор) в R

firstset <- sample(mydata, size=400) 

... но это не разбивает данные (другими словами, я до сих пор не знаю, какие 600 значений поместить в другой набор). Я также думал о том, что цикл занимает от 1 до 400, случайным образом удаляя 1 значение за раз и помещая его в firstset. Это правильно разделило бы данные, но как реализовать это мне не ясно. Плюс мне сказали, что избегают for петель в R, когда это возможно.

Любые идеи?

+2

точка на циклах 'for' не очень подходит. IIRC это проблема в S-Plus, но не так много в R. Пока вы выделяете достаточное количество хранилища для результата (вместо того, чтобы расти или конкатенатировать в течение каждой итерации цикла), 'for' loops могут быть такими быстрыми, если не быстрее других подходы R («apply» и family) и намерение явного цикла «for» в коде могут быть более легко восприняты, чем тайный однострочный вызов «apply». –

ответ

9

Вместо выборки значений вы можете пробовать свои позиции.

positions <- sample(length(mydata), size=400) # ucfagls' suggestion 
firstset <- mydata[positions] 
secondset <- mydata[-positions] 

EDIT: предложение ucfagls' будет более эффективным (особенно для больших векторов), так как это позволяет избежать выделения вектора позиций в R.

+0

Очень крутая идея. Благодаря! –

+1

Первая строка может быть упрощена до 'position <- sample (length (mydata), size = 400)', поэтому вам не нужно генерировать вектор, из которого нужно выполнить выборку. Первому аргументу разрешено быть положительным целым числом. Или даже для 'position <- sample (mydata, size = 400)'. –

+0

Несомненно, позиции <- sample (mydata, size = 400) вернут фактические значения из mydata, а не позиций? Вы не сможете получить другой 600. Вы получили это в первый раз! – Spacedman

4

Если mydata действительно вектор, один вариант был бы:

split(mydata, sample(c(rep("group1", 600), rep("group2", 400)))) 
+0

Я не знал, что первым аргументом «образец» может быть вектор. Благодаря! –

+0

Кроме того, это будет хранить оба подмножества исходных данных в одном объекте (списке), не позволяя глобальному рабочему пространству быть загроможденным. – Greg

8

Просто рандомизации MyData и принять первый 400, а затем последний 600.

mydata <- sample(mydata) 
firstset <- mydata[1:400] 
secondset <- mydata[401:1000] 
Смежные вопросы