Сохранение значений в одной строке на основе значений в разных строках и разных столбцах

#r #dplyr

#r #dplyr

Вопрос:

Есть ли способ создать новый DF для значений tdif только тогда, когда NP==0 они находятся в строке непосредственно над ним?

     Subject tdif NP
1       KM3 63.8  0
2       KM3  4.6  1
3       KM3 70.6  0
4       KM3 30.4  1
5       KM3 44.8  0
6       KM3 12.1  1
7       KM3 27.1  1
8       KM3 36.0  0
9       KM3 38.0  1
10      KM3  0.1  1
  

Таким образом, желаемый результат будет:

     Subject tdif NP
1       KM3  4.6  1
2       KM3 30.4  1
3       KM3 12.1  1
4       KM3 38.0  1
  

Я доволен использованием tidyverse or любых других пакетов (до сих пор я использовал его для обработки своих необработанных данных), но у меня было чертовски много времени на поиск помощи для этого конкретного типа обработки данных в R.

Ответ №1:

Мы могли бы использовать which , чтобы получить индекс строки where NP == 0 и добавить к нему 1, чтобы получить следующую строку.

 df[which(df$NP == 0)   1, ]

#  Subject tdif NP
#2     KM3  4.6  1
#4     KM3 30.4  1
#6     KM3 12.1  1
#9     KM3 38.0  1
  

Если у вас 0 в последней строке, это может дать вам дополнительную строку с NA s, которую вы можете удалить, сравнив значения с nrow(df) или используя dplyr::lag .


С dplyr lag

 library(dplyr)
df %>% filter(lag(NP) == 0)
  

Комментарии:

1. Насколько я могу судить по моим фактическим данным, это работает. Спасибо! Как именно это работает? Я все еще новичок в понимании синтаксиса кода.

2. @Kevin which(df$NP == 0) возвращает номер строки, к которому NP == 0 мы добавляем 1, чтобы получить следующую строку, и используем этот индекс для подмножества фрейма данных, тогда как lag просто выбирает те строки, предыдущее NP значение которых было 0.