Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: [РЕШЕНО] удалить повторы в таблице  (Прочитано 1040 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Здравствуйте!
Есть такая задача. Имеется таблица такого вида:
(Нажмите, чтобы показать/скрыть)

Необходимо убрать повторяющиеся сочетания значений в первой и второй колонке, выбрав для оставшегося для каждого столбца (начиная с третьего, разумеется) наибольшее (1 или 0) значение из встречавшихся среди повторяющихся строк.
Как это реализовать? Любыми средствами.
Нагуглил, как просто убрать повторы:
cat 1.txt | sort | uniq > 2.txt
Если есть знатоки, особенно любопытно, как это сделать в R, но это чисто из интереса.

Пользователь решил продолжить мысль 28 Января 2011, 01:41:32:
Для начала, наверное, надо объединить две первые колонки, по которым и сортировать, это я и сам смогу сделать легко. Но дальше не представляю, как подступиться.
« Последнее редактирование: 28 Января 2011, 14:18:24 от Phlya »
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: удалить повторы в таблице
« Ответ #1 : 28 Января 2011, 04:06:21 »
Необходимо убрать повторяющиеся сочетания значений в первой и второй колонке, выбрав для оставшегося для каждого столбца (начиная с третьего, разумеется) наибольшее (1 или 0) значение из встречавшихся среди повторяющихся строк.
А если в 3-м столбце max будет в 1-й строке, а в 4-м столбце max -- в 5 строке при условии совпадения значений в первых 2-х столбцах, тогда чему отдавать приоритет?

Нагуглил, как просто убрать повторы:
cat 1.txt | sort | uniq > 2.txt
Оптимальнее так:
sort -u 1.txt >2.txt
ps
В целом, думаю, имеет смысл реализовывать на awk.
« Последнее редактирование: 28 Января 2011, 04:18:18 от arcfi »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #2 : 28 Января 2011, 10:57:29 »
В R есть функция aggregate, это лучший вариант, задача как раз для нее.
К сожалению, нет R под рукой, конкретные параметры сказать не могу.
Поскольку там только нули и единицы, можно привести это к типу boolean и для аггрегирования использовать функцию or.
« Последнее редактирование: 28 Января 2011, 11:00:50 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #3 : 28 Января 2011, 11:05:25 »
А если в 3-м столбце max будет в 1-й строке, а в 4-м столбце max -- в 5 строке при условии совпадения значений в первых 2-х столбцах, тогда чему отдавать приоритет?

Надо не отдавать чему-то из них приоритет, в полученной строке должно выбираться для каждого значения максимум среди всех имеющихся в данном столбце (для данного сочетания в первых двух столбцах).

Оптимальнее так:
sort -u 1.txt >2.txt
Да, наверное.

В R есть функция aggregate, это лучший вариант, задача как раз для нее.
К сожалению, нет R под рукой, конкретные параметры сказать не могу.
Поскольку там только нули и единицы, можно привести это к типу boolean и для аггрегирования использовать функцию or.

Спасибо, сейчас посмотрю, может разберусь.
Что такое тип boolean? Я только начал с R работать.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #4 : 28 Января 2011, 11:46:11 »
Спасибо, сейчас посмотрю, может разберусь.
Что такое тип boolean? Я только начал с R работать.

логический, два значения, true и false

получить справку по функции - в строке R набрать "?функция" или help(функция).
?aggregate

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

Да, я, кажется, перепутал. Тип, кажется, называется logical, а не boolean.
Числа приводятся к нему функцией as.logical()
« Последнее редактирование: 28 Января 2011, 11:53:14 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #5 : 28 Января 2011, 11:52:23 »
логический, два значения, true и false

получить справку по функции - в строке R набрать "?функция" или help(функция).
?aggregate

R форум, рекомендую. Только надо на их список рассылки сначала подписаться.

ну, как справку получить я знаю, спасибо)))
За форум тоже спасибо, это я не знал, хотя про список рассылки знаю.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #6 : 28 Января 2011, 11:55:06 »
За форум тоже спасибо, это я не знал, хотя про список рассылки знаю.
Пардон, болею, поэтому заговариваюсь. Это не форум, на самом деле, а архив их списка рассылки, с поиском.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #7 : 28 Января 2011, 11:58:55 »
Ааа то есть если там создать новую тему, то она отправится всем по почте, кто подписан на список рассылки?
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #8 : 28 Января 2011, 13:27:37 »
Ааа то есть если там создать новую тему, то она отправится всем по почте, кто подписан на список рассылки?
Да.
Аналогичного свойства архивы есть на GMANE и еще где-то.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #9 : 28 Января 2011, 13:58:20 »
Круто.
Разобрался, aggregate помог.
aggregate(A, by=list(A[,1], FUN=median)Выдает немного шлака в таблице тоже почему-то, но это все исправляется в электронных таблицах, там очевидно. А дальше при обработке уже можно округлить все вверх (чтобы, если была хоть одна 1, значение стало 1)
apply(A, 2, ceiling). Соответственно, можно потом округлять все вниз, можно по общим правилам (тогда если в половине или более случаев была 1, то станет 1)...
Спасибо!
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: удалить повторы в таблице
« Ответ #10 : 28 Января 2011, 19:02:45 »
Разобрался, aggregate помог.
aggregate(A, by=list(A[,1], FUN=median)Выдает немного шлака в таблице тоже почему-то, но это все исправляется в электронных таблицах, там очевидно. А дальше при обработке уже можно округлить все вверх (чтобы, если была хоть одна 1, значение стало 1)

Это все можно сделать in one go... Только я не помню как :)
Да, а как же так, аггрегировать надо было по первым двум столбцам, а у Вас A[,1]?
 
Можно попробовать что-то типа
aggregate(A, by=list(A[,1:2]), FUN=function(x){any(x==1)})
или
aggregate(A, by=list(A[,1:2]), FUN=function(x){any(as.logical(x))})

На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: [РЕШЕНО] удалить повторы в таблице
« Ответ #11 : 28 Января 2011, 19:06:27 »
Цитировать
Для начала, наверное, надо объединить две первые колонки, по которым и сортировать, это я и сам смогу сделать легко. Но дальше не представляю, как подступиться.

Это я легко сделал с помощью электронных таблиц и текстового редактора. Поэтому только первый столбец.
А все вместе можно сделать, написав
>aggregate (...); apply(...) =)
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: [РЕШЕНО] удалить повторы в таблице
« Ответ #12 : 03 Февраля 2011, 13:33:57 »
table<-read.table("table.txt",header=TRUE)
aggregate(table[,3:11], by=list(table[,1],table[,2]), FUN=max)
Вот теперь точно решено.

PS. В файле table.txt данные в том виде, в каком они были под спойлером, с заголовками, разделенные кучей пробелов и т.п., я просто из окошка браузера их скопировал, а в терминале запустил vi и нажал Ctrl-V.

И решение для переменного количества столбцов
aggregate(table[,-(1:2)], by=list(table[,1],table[,2]), FUN=max)

И самый красивый вариант, который сохранит имена столбцов. :)
aggregate(table[,-(1:2)], by=as.list(table[,1:2]), FUN=max)
« Последнее редактирование: 04 Февраля 2011, 16:29:52 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: [РЕШЕНО] удалить повторы в таблице
« Ответ #13 : 05 Февраля 2011, 23:29:10 »
Спасибо за уточнение. Почему-то у меня FUN=max не работало, сейчас уже не помню, на что ругалось...
Ubuntu 14.04 (Unity), MSI GE40

 

Страница сгенерирована за 0.023 секунд. Запросов: 22.