2016-03-18 8 views
0

Я пытаюсь подмножество data.frame на основе 1 или 0 значение data.frame.Как подмножество 'n' количества строк, прошедших определенное значение?

Вот пример кода;

> Test 
      Close High Low Dn.BB  MaVg Up.BB  Per.BB Dn.Brk 
2007-02-27 6286.1 6434.7 6270.5 6305.813 6389.679 6473.544 -0.11752900  1 
2007-02-28 6171.5 6286.1 6166.2 6237.635 6377.186 6516.737 -0.23695539  1 
2007-03-01 6116.0 6230.7 6038.9 6164.470 6358.129 6551.787 -0.12514308  1 
2007-03-02 6116.2 6164.4 6085.6 6110.807 6341.179 6571.550 0.01170495  0 
2007-03-05 6058.7 6116.2 5989.6 6047.421 6318.100 6588.779 0.02083561  0 
2007-03-06 6138.5 6138.5 6058.7 6018.953 6297.907 6576.861 0.21427696  0 
2007-03-07 6156.5 6167.6 6106.1 6001.139 6278.136 6555.133 0.28043853  0 
2007-03-08 6227.7 6233.1 6156.5 5997.989 6264.436 6530.882 0.43106389  0 
2007-03-09 6245.2 6255.8 6190.3 6003.152 6250.207 6497.262 0.48986661  0 
2007-03-12 6233.3 6276.3 6219.3 6007.297 6237.421 6467.546 0.49104464  0 
2007-03-13 6161.2 6240.7 6161.2 6000.401 6223.429 6446.457 0.36049188  0 

Здесь я хотел бы иметь что-то, что перебирает вдоль data.frame, а затем расщепляется из подмножества на основе Dn.Brk > 0. Я могу только думать о методе loop и не знаком с sub-setting, так было интересно, может ли кто-нибудь указать мне в правильном направлении/предоставить несколько советов о функциях/пакетах, которые могли бы это сделать?

Немного подробнее ниже;

Sub <- rep(0,nrow(Test)) 
for (i in nrow(Test)){ 
    if (Test[i,8] > 0){Sub = Test(i:i+10,1)} 
} 

Таким образом, выше были бы в каждой точке, где Test[i,8] > 0, выберите, Test$Close из i:i+10.

В идеале, я хотел бы, чтобы каждый образец хранился в отдельной строке/столбце в новом df. Это возможно?

+2

Можете ли вы показать свой желаемый результат тоже ** для этого конкретного набора данных **? –

+0

'split (Test, Test $ Dn.Brk> 0)'? – Sotos

+2

@Sotos им тоже нужно условие 'i: i + 10'. И непонятно, что они хотят сделать для повторения появления '1' после '0' –

ответ

1

Вы можете использовать sapply здесь:

sapply(which(Test[, 8] > 0), function(z) Test$Close[z:(z+10)]) 

несколько вещей, чтобы отметить в цикле вы предоставили, хотя:

  • Вы не итерация: Ваш цикл из i in nrow(Test), которая эффективна nrow(Test)
  • Вы будете переписывать Sub с каждой итерацией
+0

Благодарим вас за дополнительные знания. Нужно ли разделить этот вывод на отдельные строки/столбцы? Например, если имеется 63 точки> 0, то df будет содержать либо 63 строки/столбцы этого вывода? – WillJ

+0

В отдельных столбцах для каждого теста [, 8]> 0 – Raad

0

Если вы еще в поисках делать это с циклом вот ответ:

#### results list ##### 
results <- list() 

for (i in rows.test){ 
if (test[i,8] > 0) 
{ 
    results[[i]] = test$Close[i:(i+10)] 
} 
else {results[[i]] = "no value"} 
} 

Это также может быть дополнительно параллелизуемо, если ваш набор данные огромны с пакетом под названием Еогеасп. Хорошее введение здесь: http://www.vikparuchuri.com/blog/parallel-r-loops-for-windows-and-linux/. Вы также можете изменить «нет значения» на следующий, если вы хотите, чтобы список состоял только из трех именованных элементов.