2017-05-15 2 views
-2

Ich möchte eindeutige Anzahl x Wert für Spalten Spalte x durch '|' und Teilstring links 2 Zeichen in R.Eindeutige Anzahl für eine Spalte - geteilt durch Trennzeichen und eindeutige Anzahl für Teilzeichenfolge

df <-data.frame(id = c(11,22,33,44), 
       x = c(NA,'cna|cnb|jpa|usa|jpb|usb','kra|krb|kru|usb|usa','jpa|jpu|epa|epb|usa|woa|cna|jpu')) 

> df 
    id        x 
1 11       <NA> 
2 22   cna|cnb|jpa|usa|jpb|usb 
3 33    kra|krb|kru|usb|usa 
4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu 

Ich möchte unten erhalten.

id count 
1 11 0 
2 22 3 
3 33 2   
4 44 5 
  • Zeile 1 0
  • line 2 CN, jp, us (3 data)
  • Leitung 3 ist kr, us (2-Daten)
  • Leitung 4 ist jp, ep , wir, wo, cn (5 Daten)

Antwort

1

Wir können tidyverse verwenden. Wir teilten uns die Elemente in ‚x‘ und erweitern, um lange Format mit separate_rows, mutate der ‚x‘, indem nur die ersten beiden Zeichen unter (substr), gruppiert nach ‚id‘, finden die count von einzigartigen nicht-NA-Elemente unter Verwendung n_distinct

library(tidyverse) 
df %>% 
    separate_rows(x) %>% 
    mutate(x= substr(x, 1, 2)) %>% 
    group_by(id) %>% 
    summarise(count = n_distinct(x[!is.na(x)])) 
# A tibble: 4 x 2 
#  id count 
# <dbl> <int> 
#1 11  0 
#2 22  3 
#3 33  2 
#4 44  5 
+1

wow! es ist beeindruckend! danke ~ – user3317871

+0

@ user3317871 Danke. Sie können auch [hier] (http://stackoverflow.com/help/someone-answers) überprüfen – akrun

2

Hier ist ein weiterer Ansatz. Es ist nicht so kompakt und einfach wie akrun ‚s Antwort, aber es hängt nicht von irgendwelchen Bibliotheken:

df$count <- sapply(df$x, function(varx){ 
    strs <- unique(sapply(unlist(strsplit(varx, "|", fixed = T)), function(string){ 
     substr(string, 1, 2) 
    })) 
    length(strs[!is.na(strs)]) 
}) 

Ausgang:

id        x count 
1 11       <NA>  0 
2 22   cna|cnb|jpa|usa|jpb|usb  3 
3 33    kra|krb|kru|usb|usa  2 
4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu  5 
+1

Ein bisschen kürzer: 'sapply (sapply (strsplit (as.character (df $ x), '\\'), substr, start = 1, stop = 2), function (x) length (unique (na.omit (x)))) ' – Jaap

+1

@Jaap, ein wenig kürzer (eine weniger sapply) wäre' sapply (strsplit (as .character (df $ x), "|", fest = TRUE), Funktion (x) Länge (einzigartig (substr (na.omit (x), 1, 2))) ' –

+0

great ~! Die Lösung ist so einfach! Vielen Dank! – user3317871

Verwandte Themen