2016-12-11 4 views
2

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

Select specific rows based on previous row value (in the same column)

Основная идея для выбора всех строк со значением 20 в столбце Тип, который сразу же следует за строкой со значением 40 в столбце Тип. Конечным результатом должен быть кадр данных с только строками со значениями 20 или 40 в столбце Тип.

предлагаемое решение выглядит следующим образом:

# Get indices of rows that meet condition 
ind2 <- which(df$Type==20 & dplyr::lag(df$Type)==40) 
# Get indices of rows before the ones that meet condition 
ind1 <- which(df$Type==20 & dplyr::lag(df$Type)==40)-1 

Это работает и я могу видеть, что правильные строки были выбраны.

Но последний шаг Подменю данные

df[c(ind1,ind2)] 

возвращает сообщение об ошибке:

Error in `[.data.frame`(df, c(ind1, ind2)) : undefined columns selected 

Я не могу понять, почему это происходит. Любые идеи, чтобы пройти мимо этого, будут высоко оценены!

+1

'df [c (ind1, ind2),]' может быть? – Abdou

ответ

0

Как правильно Абду заявил: df[c(ind1,ind2)] является неполным. Всякий раз, когда вы используете матрицу или кадр данных, квадратные скобки указывают на это: [ rows , columns ].

В вашем случае вы указали для блока данных, чтобы выбрать комбинацию ind1 and ind2, не указывая, чтобы он выглядел либо в строках, либо в столбцах. В результате вы получили ошибку. Специфически R рассмотрит возможность просмотра столбцов на основе тех спецификаций ind1 и ind2.

Просто пояснив его как df[c(ind1,ind2),], ваш df отобразит все строки, содержащие нужные значения.

+0

Ваши объяснения не совсем правильные. Индексирование data.frame только с одним вектором, например 'df [c (ind1, ind2)]' будет рассматриваться как индексирование только по столбцам, что является допустимым кодом и работает до тех пор, пока существуют эти столбцы. (Напротив, data.tables рассматривали бы это как индексирование только по строкам, что может быть ошибкой, сделанной в примере) – ping

+0

Это правильно, я просто указывал на это, так как он хотел только получить строки. Вот почему я сказал, что он неполный. Также, поскольку в его данных нет столбцов с именами 'ind1' и' ind2'. –

+0

Да, поэтому ваш средний раздел неправильный/вводящий в заблуждение, и его лучше удалить, чтобы избежать путаницы. Код говорит, что вы смотрите в столбцах (не так, как вы предлагаете), и R не смотрит в строки сначала, как вы предполагаете, - это не выглядит в строках вообще. – ping

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

  • Нет связанных вопросов^_^