2016-07-25 12 views
-1

Ich möchte eine Funktion für jedes Element eines Datenrahmens ausführen. Zum Beispiel habe ich einen Datenrahmen df1 mit 9 Zahlen und ich möchte einen zweiten Datenrahmen df2 erzeugen, wo die Werte 1 sind, wenn die Zahl auf dem gleichen Index im ersten Datenrahmen 2 und sonst 0 ist. Die Funktion es scheint mir ok - aber ich habe Probleme mit der Funktion anwenden - welche Funktion führt eine Funktion für jedes Element eines Datenrahmens aus? Vielen Dank im Voraus!Funktion auf jedem Wert eines Datenrahmens ausführen

Beispiel

#   1 2 3   0 1 0 
# df1 <- 4 5 6 df2 <- 0 0 0 
#   7 8 9   0 0 0 

Code

a <- c(1, 2, 3) 
b <- c(4, 5, 6) 
c <- c(7, 8, 9) 
df1 <- data.frame(a, b, c) 

mf <- function(x) { 
    if (x == 2) {x <- 1} 
    else {x <- 0} 
        } 
# something like: 
df2 <- apply(df1, 1:3, mf(x)) 
+4

'df2 <- as.data.frame ((df1 == 2) * 1)' – scoa

Antwort

0

Sie können dies tun, wenn Sie speziell tun wollen, dass es mit apply Familie Funktionen:

data.frame(apply(df1,2,function(a) { sapply(a, mf) })) 

#  X1 X2 X3 
#a 0 1 0 
#b 0 0 0 
#c 0 0 0 

Oder mit mapply:

data.frame(matrix(mapply(mf,df1), nrow = 3)) 

Gegeben Funktion mf:

mf <- function(x) { 
    if (x == 2) return(1) 

    return(0) 
} 

Daten

df1 <- structure(c(1, 4, 7, 2, 5, 8, 3, 6, 9), .Dim = c(3L, 3L), .Dimnames = list(
    c("a", "b", "c"), NULL)) 
0

Verwenden ifelse() die oben genannte Bedingung erfüllen

 df <- data.frame(a=1:3,b=4:6,c=7:9) 
    df 
    # a b c 
    # 1 1 4 7 
    # 2 2 5 8 
    # 3 3 6 9 

    df1 <- data.frame(ifelse(df == 2, 1, 0)) 
    df1 
    # a b c 
    # 1 0 0 0 
    # 2 1 0 0 
    # 3 0 0 0 
0

Eine Option istzu verwendenund simplify_all() aus dem purrr Paket.

Hier ist ein Beispiel in einer Datenpipeline:

library(purrr) 
d <- data.frame(a = 1:3, b = 4:6, c = 7:9) 

mf <- function(x) { 
    if (x == 2) {x <- 1} 
    else {x <- 0} 
} 

d %>% map(map, mf) %>% simplify_all() %>% data.frame() 

#> a b c 
#> 1 0 0 0 
#> 2 1 0 0 
#> 3 0 0 0 

Vielleicht nicht ideal, aber d %>% map(map, mf) ausgeführt wird Ihre Funktion, mf() auf jedem Element des Datenrahmens. Dies gibt eine Liste von Listen zurück. Der Rest - %>% simplify_all() %>% data.frame() - konvertiert die resultierende Liste von Listen zurück in die ursprüngliche Datenrahmenstruktur.

Verwandte Themen