2016-06-03 4 views
2
x <- c(1,2,3,2,1) 

table(x) 
# x 
# 1 2 3 
# 2 2 1 

Gibt aus, wie oft jedes Element im Vektor vorkommen soll.Implementieren Sie die Funktion table() als benutzerdefinierte Funktion

Ich versuche, die obige Funktion mit function()

Im Folgenden mein Code zu imitieren:

TotalTimes = function(x){ 
    times = 0 
    y = unique(x) 
    for (i in 1:length(y)) { 
    for (i in 1:length(x)) { 
     if(y[i] == x[i]) 
     times = times + 1 
    } 
    return(times) 
    } 
} 

Was den richtigen Ansatz wäre?

Antwort

2

Hier ist ein Verfahren unter Verwendung einer Base R:

# data 
x <- c(1,2,3,2,1) 

# set up 
y <- sort(unique(x)) 
counts <- rep_len(0, length.out=length(y)) 
names(counts) <- y 

for(i in seq_along(x)) { 
    counts[x[i] == y] <- counts[x[i] == y] + 1 
} 

es in einer Funktion Verpackung:

table2 <- function(x) { 
    # transform x into character vector to reduce search cost in loop 
    x <- as.character(x) 
    y <- sort(unique(x)) 
    counts <- rep_len(0, length.out=length(y)) 
    names(counts) <- y 

    for(i in seq_along(x)) { 
    counts[x[i]] <- counts[x[i]] + 1L 
    } 
    return(counts) 
} 

Diese Version akzeptiert nur einen einzigen Vektor, natürlich. Bei @ Franks Vorschlag ist die Funktionsversion etwas anders und möglicherweise schneller, da sie die Eingabe x in ein Zeichen umwandelt. Die mögliche Beschleunigung ist in der Suche in counts[x[i]], wo der Name in counts bezeichnet wird (als x [i]), anstatt eine Suche mit "==."

+0

'x's Werte dienen nur als Namen. Könnte auch nur 'x <- as.character (x)' als einen ersten Schritt innerhalb der Funktion, so können Sie tun, zählt [x [i]] <- counts [x [i]] + 1L' – Frank

+0

Noch einmal vielen Dank , @Frank. Ich habe den Schnitt gemacht. – lmo

3
function(x) { 
    q = sapply(unique(x), function(i) sum(x == i)) 
    names(q) = unique(x) 
    return(q) 
} 
5

Hier ist ein Einzeiler, rle() mit:

f <- function(x) { 
    with(rle(sort(x)), setNames(lengths, values)) 
} 

f(c(1,2,3,2,1)) 
# 1 2 3 
# 2 2 1 

Alternativ, hier ist eine Option, die weniger "tricky" ist, und ist wahrscheinlich ein besseres Modell für in einem R-ish Weg, um Code zu lernen :

f2 <- function(x) { 
    ss <- sort(x) 
    uu <- unique(ss) 
    names(uu) <- uu 
    sapply(uu, function(u) sum(ss == u)) 
} 

f2(c(1,2,3,2,1)) 
# 1 2 3 
# 2 2 1 
+0

Ich wollte etwas, das mit Base R ohne eine spezielle Funktion gemacht werden könnte – Rohan

+1

@NehalMishra Dies ist * Basis R. – RHertel

+0

@RHertel ja die bearbeitete Version ist Basis R – Rohan

Verwandte Themen