Как удалить только один экземпляр дублирующегося значения в векторе в R? - PullRequest
3 голосов
/ 12 ноября 2011

Рассмотрим вектор числовых значений «х».Некоторые значения могут быть дубликатами.Мне нужно удалить максимальное значение по одному, пока x не станет пустым.

Проблема, если я использую:

x <- x[x != max(x)]

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

max.x <- x[x == max(x)]
max.x <- max.x[1:length(max.x) - 1]
x <- c(x[x != max(x)], max.x)

Но это далеко от вычислительной эффективности, и я не достаточно хорош в R, чтобы найти правильный способ сделать это.Может у кого-нибудь есть лучший трюк?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 ноября 2011

Просто для удовольствия,
х <- х [-ч.макс (х)] </p>

ополосните, вспените, повторите.

dagnabit howcome 4 пробела не вызывают окрашивание кода?

1 голос
/ 12 ноября 2011

Тебе не совсем ясно, в чем заключается масштаб твоей проблемы, поэтому я просто дам первое предложение, которое у меня возникнет.Используйте функцию sort, чтобы получить список значений в порядке убывания.

sorted <- sort(x,decreasing=TRUE,index.return=TRUE)

Теперь вы можете итеративно удалять самый высокий элемент из x.Повторное использование функции sort снова и снова в данных вашего подмножества неэффективно - лучше сохранить постоянную копию x и по возможности удалить ее из нее.

Рассмотреть этот подход

# random set of data with duplicates
x <- floor(runif(50)*15)
# sort with index.return returns a sorted x in sorted$x and the 
# indices of the sorted values from the original x in sorted$ix
sorted <- sort(x,decreasing=TRUE,index.return=TRUE)

for( i in 1:length(x) )
{
 # remove data from x
 newX <- x[-sorted$ix[1:i]]
 print(sort(newX,decreasing=TRUE))
}
0 голосов
/ 12 ноября 2011

Как я понимаю твой вопрос,

 ?unique

может дать вам то, что вы хотите.

Rgds, Rainer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...