Разделить информационный кадр на строку в первом случае - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь разбить фрейм данных на две части по строкам в первом экземпляре определенного значения, т. Е. Не по группам. Например, если мои данные:

patid disease
3     Z
99    B
4     A
1002  B
43    A
745   C
399   Z
545   A 
8     A

Я хотел бы получить два кадра данных из этого: первый кадр данных должен содержать первые две строки, а второй - все остальные, т. Е. Я разделяю первые случаи болезни А. В конечном итоге я откажусь от всего, что пришло до A, т. е. первые два появления заболеваний B и Z.

Обратите внимание, что я не могу упорядочить строки каким-либо образом, так как это записи по времени (истории болезни).

Я могу сделать это в цикле, просто! Однако я знаю, что R не поддерживает циклы.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Другой способ - использовать which.max, чтобы получить индекс первого появления «A» в столбце disease и получить все строки после этого.

df[which.max(df$disease == "A"):nrow(df), ]

#  patid disease
#3     4       A
#4  1002       B
#5    43       A
#6   745       C
#7   399       Z
#8   545       A
#9     8       A

и то же самое может быть достигнуто с помощью match

df[match("A", df$disease):nrow(df), ]
0 голосов
/ 27 апреля 2018

Вы можете использовать which.min и grepl:

df[which.min(!grepl("A", df[,"disease"])):nrow(df),]

Получение

  patid disease
3     4       A
4  1002       B
5    43       A
6   745       C
7   399       Z
8   545       A
9     8       A
0 голосов
/ 27 апреля 2018

Если вашей конечной целью является подмножество данных, вы можете сделать это напрямую:

subset(df, cumsum(disease == "A") >= 1)
#  patid disease
#3     4       A
#4  1002       B
#5    43       A
#6   745       C
#7   399       Z
#8   545       A
#9     8       A

Но если вы хотите разделить данные, вы можете сделать это аналогично:

split(df, cumsum(df$disease == "A") >= 1)
# $`FALSE`
# patid disease
# 1     3       Z
# 2    99       B
# 
# $`TRUE`
# patid disease
# 3     4       A
# 4  1002       B
# 5    43       A
# 6   745       C
# 7   399       Z
# 8   545       A
# 9     8       A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...