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

У меня есть фрейм данных с несколькими дубликатами, которые я хочу удалить, учитывая определенное условие.

У меня есть столбец (column_A), который содержит результат анализа. Некоторые из идентификаторов в моем фрейме данных имеют два результата, и именно так происходит дублирование идентификаторов. Я хочу сохранить строку, где column_A == «analysisB», если идентификатор в «id_no» содержит как «analysisA», так и «analysisB» в column_A, в противном случае не удаляйте строку.

(Обратите внимание, что исходный фрейм данных, на котором я запускаю это, имеет несколько других символьных и числовых столбцов)

Фиктивные данные:

structure(list(id_no = structure(c(1L, 2L, 2L, 3L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), column_A = structure(c(1L, 
1L, 2L, 2L, 1L, 2L), .Label = c("analysisA", "analysisB"), class = "factor")), .Names = c("id_no", 
"column_A"), row.names = c(NA, -6L), class = "data.frame")

Что выглядит так:

id_no    column_A
A        analysisA
B        analysisA
B        analysisB
C        analysisB
D        analysisA
D        analysisB

Ожидаемый результат:

id_no    column_A
A        analysisA
B        analysisB
C        analysisB
D        analysisB

Есть ли способ сделать это с помощью dplyr? У меня не получилось правильно работать с условной фильтрацией с помощью filter ().

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Data.table путь:


В вашем тестовом примере вы, по сути, хотите последний элемент для каждой группы идентификаторов , поэтому будет работать следующий однострочный файл data.table, использующий tail.

library(data.table)

dt[, tail(.SD,1), by=id_no]

Будет производить:

> dt[, tail(.SD,1), by=id_no]
   id_no  column_A
1:     A analysisA
2:     B analysisB
3:     C analysisB
4:     D analysisB

Источник:

документация data.table

0 голосов
/ 12 мая 2018

Мы могли бы использовать base R duplicated

df1[!duplicated(df1$id_no, fromLast = TRUE),]
#   id_no  column_A
#1     A analysisA
#3     B analysisB
#4     C analysisB
#6     D analysisB
0 голосов
/ 11 мая 2018

Будет ли это делать?

data.df%>%
group_by(id_no)%>%
mutate(analysis_count=1:n(),singleton=n()==1)%>%
ungroup()%>%
filter(singleton|analysis_count==2)%>%
select(-analysis_count, -singleton)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...