Удаление дубликатов, если в одном из дубликатов в R есть NA - PullRequest
2 голосов
/ 05 августа 2020

Я пытаюсь удалить дубликаты из набора данных (из-за слияния). Однако одна строка содержит значение, а другая - нет, в некоторых случаях обе строки - NA. Я хочу сохранить те, у которых есть данные, а если они есть на НА, то не имеет значения, какие я храню. Как я могу это сделать? Я застрял.

Я безуспешно пробовал решения здесь (также обычно не работаю с data.table, поэтому я не понимаю, что к чему)

R data.table удалить строки, где один столбец дублируется, если другой столбец - NA

Некоторые минимальные данные примера:

df <- data.frame(ID = c("A", "A", "B", "B", "C", "D", "E", "G", "H", "J", "J"),
                 value = c(NA, 1L, NA, NA, 1L, 1L, 1L, 1L, 1L, NA, 1L))

ID value
A    NA
A     1
B    NA
B    NA
C     1
D     1
E     1
G     1
H     1
J    NA
J     1

, и я хочу это:

ID value
A     1
B    NA
C     1
D     1
E     1
G     1
H     1
J     1

Ответы [ 3 ]

3 голосов
/ 05 августа 2020

Альтернатива ответа @ tmfmnk с slice_max() в dplyr.

library(dplyr)

df %>%
  group_by(ID) %>%
  slice_max(!is.na(value), with_ties = F)

# # A tibble: 8 x 2
# # Groups:   ID [8]
#   ID    value
#   <chr> <int>
# 1 A         1
# 2 B        NA
# 3 C         1
# 4 D         1
# 5 E         1
# 6 G         1
# 7 H         1
# 8 J         1
3 голосов
/ 05 августа 2020

Одна из возможностей использования dplyr может быть:

df %>%
 group_by(ID) %>%
 slice(which.max(!is.na(value)))

  ID    value
  <chr> <int>
1 A         1
2 B        NA
3 C         1
4 D         1
5 E         1
6 G         1
7 H         1
8 J         1
2 голосов
/ 05 августа 2020

Вот относительно простое решение data.table.

Группировка по ID, если все значения равны NA, просто возьмите первое value, если не возьмите все значения, отличные от NA.

library(data.table)
setDT(df)
df[, if (all(is.na(value))) value[1] else value[!is.na(value)], by = ID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...