2016-06-28 9 views
1

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

data('chickwts') 
chickwts[order(chickwts$weight),] 

Я хотел бы иметь возможность получить общее количество уникальных каналов для предыдущих строк. Поэтому, если бы я хотел weight < 150 в качестве моего обреза, я бы получил feed count = 2. В идеале я мог бы создать столбец, который также отслеживает этот счетчик по всем строкам и намечает этот номер против weight в этом случае.

Я знаю, что могу предварительно выбрать/подмножество с grepl:

chickwts$seed=ifelse(grepl("seed",chickwts$feed),TRUE,FALSE)*1 
chickwts[order(chickwts$weight), ] 

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

+0

chickwts должен быть один из базы datasets.:https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html – desc

+0

Minimal - происходит от простого набора данных доступен всем. Завершить - если вы можете ответить на вопрос о chickwts, тогда он ответит на мой гораздо больший объем данных. – desc

+0

Вы исправили это нормально. Извините, что вы так особенны, но вы получите это, потратив достаточно времени на SO. Тем не менее, мы пытаемся улучшить качество вопроса. –

ответ

1
data("chickwts")  
chickwts <- chickwts[order(chickwts$weight),] 

# Using < 150 as a cutoff 
cat("if you meant 1 column giving the count to all rows, based on < 150") 
chickwts$count_less_than_150 <- length(unique(chickwts$feed[chickwts$weight < 150])) 

cat("if you meant 2 columns giving the count to all rows, based on < 150 or > 150") 
chickwts$count_lt_150 <- length(unique(chickwts$feed[chickwts$weight < 150])) 
chickwts$count_ge_150 <- length(unique(chickwts$feed[chickwts$weight >= 150])) 

cat("if you meant 1 column giving the count to all rows, based on < 150 or >= 150") 
chickwts$count <- NA 
chickwts$count[chickwts$weight < 150] <- length(unique(chickwts$feed[chickwts$weight < 150])) 
chickwts$count[chickwts$weight >= 150] <- length(unique(chickwts$feed[chickwts$weight >= 150])) 
+0

Это работает, есть ли способ расширить это, чтобы использовать вес текущей строки в качестве обрезания? – desc

+0

@desc Я немного не понимаю, что вы имеете в виду, если вы дадите пример того, что вы хотите, чтобы результат выглядел так, как я могу это сделать –

+0

Не беспокойтесь, решение 'lapply' JackieJR ниже заботится об условном третьем колонка. – desc

2
data("chickwts") 
chickwts <- chickwts[order(chickwts[,"weight"]),] 
chickwts[,"unique.feed"] <- unlist(lapply(chickwts[,"weight"], function(n) with(chickwts, length(unique(feed[weight < n]))))) 
  1. Используйте все веса в качестве lapply функции
  2. Проверьте, какие веса являются менее веса текущей строки weight < n
  3. Получить соответствующие каналы весов меньше, чем у текущей строки feed[weight < n]
  4. Получите уникальные фиды и подсчитайте количество уникальных с unique и length.
  5. unlist их, как мы хотим, вектор.
+0

+1 - @JackeJR, это отлично отвечает на мой вопрос в комментариях выше. Hack-R действительно ответил на исходный вопрос, поэтому я придерживаюсь этого как официального ответа, но спасибо! – desc

Смежные вопросы