Удаление повторяющихся наблюдений в новых строках внутри каждой ячейки - PullRequest
2 голосов
/ 07 мая 2020

У меня есть данные, в которых есть наблюдения на новых строках. Например, строка 17;

> d[17, ]
# A tibble: 1 x 2
    grp figures                                                                       
  <int> <chr>                                                                         
1  9923 "0.26 - 0.31\n0.97 - 1.02\n1.29 - 1.34\n0.26 - 0.31\n0.97 - 1.02\n1.29 - 1.34"

Выглядит так:

0.26 - 0.31

0.97 - 1.02

1.29 - 1.34   # duplicate

0.26 - 0.97

1.29 - 1.34   # duplicate

Я хочу удалить строки внутри каждой ячейки, в которой есть дубликаты. Я знаю функции duplicate, но не уверен, как применять их построчно.

Данные:

d <- structure(list(grp = c(10467L, 2485L, 4749L, 331L, 2442L, 2847L, 
5910L, 10344L, 3382L, 10488L, 1665L, 6546L, 781L, 570L, 1109L, 
2181L, 9923L, 3107L, 844L, 6224L, 2781L, 671L, 1349L, 2410L, 
10256L, 944L, 5505L, 4220L, 4638L, 4917L, 868L, 9130L, 1168L, 
4294L, 5274L, 10836L, 3416L, 7427L, 2334L, 10898L), figures = c("1.13 - 1.21", 
"380 - 400", "4.35 - 4.65", "1.94 - 2.03\n2.33 - 2.42", "0.48 - 0.54", 
"3.64 - 3.66", "1.14 - 1.20", "2.87 - 2.90", "3.17 - 3.22\n3.10 - 3.20", 
"0.40 - 0.50\n0.35 - 0.45\n51 - 53", "1.01 - 1.10", "3.79 - 3.81\n3.76 - 3.80", 
"1.10 - 1.17", "1.57 - 1.67\n1.65 - 1.75", "1.35 - 1.45", "1.36 - 1.54\n1.75 - 1.80", 
"0.26 - 0.31\n0.97 - 1.02\n1.29 - 1.34\n0.26 - 0.31\n0.97 - 1.02\n1.29 - 1.34", 
"1.10 - 1.20", "1.35 - 1.50\n1.65 - 1.80\n1.35 - 1.50\n1.65 - 1.80\n1.35 - 1.50\n1.65 - 1.80", 
"2.90 - 2.95", "3.05 - 3.12\n3.05 - 3.12", "0.45 - 0.50\n0.65 - 0.70\n0.60 - 0.65", 
"1.58 - 2.08", "1.43 - 1.48", "57.9 - 72.9\n12.5 - 14.5\n0.45 - 0.52\n1.55 - 1.62", 
"1.97 - 2.01.\n1.87 - 1.94.\n2.01 - 2.08\n2.15 - 2.19", "3.25 - 3.34", 
"0.90 - 0.94", "3.45 - 3.55\n0.60 - 0.64\n0.70 - 0.74", "0.05 - 0.08", 
"2.30 - 2.40", "0.35 - 0.37\n0.33 - 0.37.\n1.05 - 1.07", "3.45 - 3.65\n3.45 - 3.65", 
"3.11 - 3.15", "0.75 - 1.00\n1.10 - 1.30", "3.50 - 3.60\n3.47 - 3.57\n3.30 - 3.40\n3.47 - 3.57\n0.10 - 0.15", 
"5.75 - 6.00\n7.00 - 7.50\n0 - 50\n500 - 550", "3.35 - 3.45\n3.30 - 3.45", 
"1.60 - 1.80.\n1.60 - 1.80", "0.98 - 1.03")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -40L))

EDIT:

Наблюдение за grp = 9923 перед удалением дубликатов:

0.26 - 0.31

0.97 - 1.02

1.29 - 1.34   # duplicate

0.26 - 0.97

1.29 - 1.34   # duplicate

Затем я смотрю на наблюдение после удаления дубликатов и получаю:

0.26 - 0.31
0.97 - 1.02
1.29 - 1.34

Он правильно удалил дубликат, но он также удалил наблюдение 0.26 - 0.97, которое не повторяется.

Ответы [ 3 ]

3 голосов
/ 07 мая 2020

Вы можете использовать unique после strsplit и после paste их снова вместе, например:

sapply(lapply(strsplit(d$figures, "\n"), unique), paste, collapse="\n")

И с одним l oop, но набирать больше, но может быть быстрее:

lapply(strsplit(d$figures, "\n"), function(x) paste(unique(x), collapse="\n"))
2 голосов
/ 07 мая 2020

Вариант с str_c

library(dplyr)
library(tidyr)
library(stringr)
d %>% 
  separate_rows(figures, sep="\n") %>%
  distinct %>%
  group_by(grp) %>% 
  summarise(figures = str_c(figures, collapse="\n"))
2 голосов
/ 07 мая 2020

Мы можем использовать separate_rows для получения данных в разных строках, удаления дубликатов и вставки их обратно.

library(dplyr)

d %>%
  tidyr::separate_rows(figures, sep = "\n") %>%
  distinct() %>%
  group_by(grp) %>%
  summarise(figures = paste0(figures, collapse = "\n"))

В базе R мы могли бы разбить строку на '\n', сохранив только уникальные значения.

d$figures <- sapply(strsplit(d$figures, '\n'), function(x) 
                     paste0(unique(x), collapse = "\n"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...