2015-02-20 3 views
6

Я хочу подсчитать количество уникальных значений в строке.Подсчитайте количество уникальных значений в строке

Например, с этим кадром данных:

example <- data.frame(var1 = c(2,3,3,2,4,5), 
        var2 = c(2,3,5,4,2,5), 
        var3 = c(3,3,4,3,4,5)) 

Я хочу, чтобы добавить столбец, который подсчитывает количество уникальных значений в строку; например 2 для первой строки (как есть 2 и 3 в первой строке) и 1 для второй строки (так как во втором ряду всего 3).

Кто-нибудь знает простой код для этого? До сих пор я только нашел код для подсчета количества уникальных значений для каждого столбца.

+5

ЕЭС 'пример < - cbind (пример, apply (пример, 1, function (x) length (unique (x)))) ' – StrikeR

ответ

7

apply Эта функция возвращает вектор количества уникальных значений в каждой строке:

apply(example, 1, function(x)length(unique(x))) 

Вы можете добавить его в свой data.frame с помощью одного из следующих двух способов (и если вы хотите, чтобы имя что в колонке, как count):

example <- cbind(example, count = apply(example, 1, function(x)length(unique(x)))) 

или

example$count <- apply(example, 1, function(x)length(unique(x))) 
-1

Мы также можем использовать векторный подход с regex. После paste элементов каждой строки набора данных (do.call(paste0, ...) соответствуют шаблону любого символа, захвата в виде группы ((.)), используя позитивный lookahead, совпадающие символы, только если они появляются позже в строке (\\1 - backreference для захваченной группы и заменить его пустым (""). Таким образом, в действительности только те персонажи остаются, которые будут уникальными. Тогда, с nchar мы подсчитать количество символов в строке.

example$count <- nchar(gsub("(.)(?=.*?\\1)", "", do.call(paste0, example), perl = TRUE)) 
example$count 
#[1] 2 1 3 3 2 1 
+0

Не знаю, почему он занижен. – akrun

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