Выберите Первое наблюдение с пропусками в R - PullRequest
0 голосов
/ 01 октября 2018

У меня есть кадр данных, похожий на этот:

ID  BP  Time value (sec)
1   75  10000
1   79  20000
2   81  30000
2   77  40000
2   83  50000
3   100 40000
3   104 30000
3   94  20000
3   101 50000

Я хочу выбрать первое наблюдение BP для каждого идентификатора.Однако столбец «значение времени» не в порядке возрастания для каждого идентификатора (например, ID = 3).Итак, для каждого идентификатора я хочу выбрать значение BP для самого низкого значения «значение времени».Я пробовал несколько вещей, например создание широкого формата, но ничего из этого не получилось.Кто-нибудь знает простое решение для этого?

Заранее спасибо!Eveline

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете использовать dplyr для этого.Для каждого ID первое (самое низкое Time_value_sec значение) выбирается с использованием rank и фильтра.

library(dplyr)
# Given your data
df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), BP = c(75L, 79L, 81L, 77L, 83L, 100L, 104L, 94L, 101L), Time_value_sec = c(10000L, 20000L, 30000L, 40000L, 50000L, 40000L, 30000L, 20000L, 50000L)), .Names = c("ID", "BP", "Time_value_sec"), class = "data.frame", row.names = c(NA, -9L))

# Filtering: Grab the first item for each ID
df1 %>%
  group_by(ID) %>%
  filter(rank(Time_value_sec, ties.method = "first") == 1)

# Output
## # A tibble: 3 x 3
## # Groups:   ID [3]
##      ID    BP Time_value_sec
##   <int> <int>          <int>
## 1     1    75          10000
## 2     2    81          30000
## 3     3    94          20000

РЕДАКТИРОВАТЬ

Альтернативным способом являетсяследующее ниже.Это предполагает, что столбец Time_value_sec имеет уникальные значения.

df1 %>%
  group_by(ID) %>%
  filter(Time_value_sec == min(Time_value_sec))
...