2015-02-20 14 views
6

Chcę policzyć liczbę unikatowych wartości w wierszu.Liczba liczba unikatowych wartości w wierszu

na przykład za pomocą tej ramce danych:

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

że chcemy dodać kolumnę zlicza liczbę unikatowych wartości w rzędzie; na przykład 2 dla pierwszego rzędu (ponieważ są 2 i 3 w pierwszym rzędzie) i 1 dla drugiego rzędu (ponieważ w drugim rzędzie są tylko 3).

Czy ktoś zna łatwy kod, aby to zrobić? Do tej pory znalazłem tylko kod do zliczania liczby unikalnych wartości na kolumnę.

+5

urządzenia UE 'przykładowe < - cbind (przykład, zastosuj (przykład, 1, długość funkcji (x) (unikalny (x))) ' – StrikeR

Odpowiedz

7

apply ta funkcja zwraca wektor liczby unikatowych wartości w każdym wierszu:

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

możesz dodać go do swojej data.frame stosując na następujące dwa sposoby (i jeśli chcesz, aby nazwy że kolumna w count)

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

lub

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

Możemy również użyć wektorowego podejścia z regex. Po dodaniu elementów każdego wiersza zestawu danych (do.call(paste0, ...) dopasuj wzorzec dowolnego znaku, przechwytuj jako grupę ((.)), korzystając z dodatniej uprzedniej strony, dopasuj znaki tylko wtedy, gdy ponownie pojawi się w ciągu znaków (\\1 - odwołanie do wzorca dla przechwyconego grupy i zastąpienie go puste (""). Tak więc, w efekcie tylko te znaki pozostają że będzie wyjątkowy. Następnie z nchar możemy policzyć liczbę znaków w ciągu.

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

Nie wiem, dlaczego jest on odrzucany. Jakiekolwiek powody? – akrun