2016-09-28 8 views
0

Ich versuche, eine kurze Funktion zu schreiben, die Werte zuweist und inkrementell einen Vektor basierend auf Werten in einem anderen Vektor auffüllt. Wenn ich zum Beispiel einen Vektor von Binärdateien a = [0,1,1,0,1] habe, möchte ich einen Vektor b mit der gleichen Länge wie a erzeugen, der einen Wert x zuweist, wenn a [1] = 0 oder ein Wert y, wenn a [1] = 1 ist. So b = [0.4,0.6,0.6,0.4,0.6]R: Befüllen eines Vektors inkrementell

Ich habe dies getan:

a<-sample(0:1,20,replace=T) 

    assign<-function(x){ 
    c<-vector() 
    for (i in 1:length(x)){ 
    ifelse (x[[i]]>0,b<-0.6,b<-0.4) 
    c[[length(c)+1]]=b} 
    return (b) 
} 

aber dann

assign(a) 

gibt nur die erste Aufgabe. Ich nehme an, ich habe die Schleife nicht korrekt verschachtelt?

+1

'b <- c (0,4, 0,6) [a + 1 ] '? – Cath

+1

'zuweisen' ay ay ay ..... –

+1

Es gibt auch eine einfache 'b <- 0.2 * a + 0.4', aber ich denke, die Lösung von @Cath ist besser, weil es die zwei möglichen Rückgabewerte 0,4 und 0,6 Zoll anzeigt der Code. – RHertel

Antwort

3

Wie Sie feststellen, dass Ihr Vektor a binär ist, können Sie es in einen Vektor von Indizes drehen und verwenden, die "Eigentum":

bfroma <- function(x) c(0.4, 0.6)[x+1] 

a <- c(0, 1, 1, 0, 1) 
bfroma(a) 
#[1] 0.4 0.6 0.6 0.4 0.6 
2

Einige Kommentare zu Ihrem Code:

  1. es nicht zu tun ifelse (x[[i]] > 0, b <- 0.6, b <- 0.4) geraten ist; ifelse wird nicht verwendet (überprüfen Sie besser erneut ?ifelse). Verwenden Sie b <- ifelse (x[[i]] > 0, 0.6, 0.4).
  2. Ich denke, Sie wollen return(c) statt return(b);
  3. Verwenden Sie einen anderen Funktionsnamen, assign maskiert das eingebaute R von R.

Wie dem auch sei, dachte ich, dass die ganze Funktion kann durch

function (x) ifelse(x > 0, 0.6, 0.4) 

oder

function (x) {x <- 0.4; x[x > 0] <- 0.6; x} 

Für Ihre insbesondere Fall ersetzt werden, in dem Eingangsvektor streng 0-1 binär ist, wir kann es besser machen. Cath hat bereits darauf hingewiesen, durch die Indizierung nur:

function (x) c(0.4, 0.6)[x + 1L] 

Allgemeiner gesagt, solange x diskret ist, wir match verwenden können Positionsindex zu erhalten und einen schnellen Austausch verwenden, auch, aber ich werde nicht auf auszuarbeiten, dass hier .

Verwandte Themen