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

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

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

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).

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

2 ответа

Решение

Это 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)))

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

example$count <- nchar(gsub("(.)(?=.*?\\1)", "", do.call(paste0, example), perl = TRUE))
example$count
#[1] 2 1 3 3 2 1
Другие вопросы по тегам