2016-07-14 33 views
-1

Angenommen, ich habe einen Datenframe, an dem ich Transformationen durchführen möchte. Normalerweise würde es wie folgt aussehen:Bedingte Werte mit Hilfe von magrit ersetzen

a <- data.frame(c(NA, 0,1), c(34,NA,0), c(3,9,NA)) 
b <- c('key1', 'key2', 'key3') 
####replace NA values with 0 
a[is.na(a)] <- 0 
####replace 1 with 2 
a[a==1] <- 2 
####sum rows 
a <- rowSums(a) 
####bind b as key column for joining datasets in a later stage 
c <- cbind(b, a) 

Nun meine Frage: Wie übersetzen ich das magrittr?

library(magrittr) 
c %>% 
.[is.na] %>% 0 %>% .[.==1] %>% 2 %>% 
rowSums %>% cbind(b, .) 

gibt mir:

Fehler in [is.na (.).]: Objekt vom Typ 'builtin' ist nicht subsettable
Zusätzlich: Warnmeldung:
In ist. na (.): is.na() angewendet (Liste oder Vektor) auf nicht vom Typ 'builtin'

Antwort

1

Wir dplyr

verwenden können 0
library(dplyr) 
a %>% 
    mutate_each(funs(replace(., is.na(.), 0))) %>% 
    mutate_each(funs(replace(., .==1, 2))) %>% 
    rowSums(.) %>% 
    data_frame(key = b, val = .) 
# key val 
# <chr> <dbl> 
#1 key1 37 
#2 key2  9 
#3 key3  2 

oder ohne

a %>% 
    is.na(.) %>% 
    replace(a, ., 0) %>% 
    replace(., .==1, 2) %>% 
    rowSums() %>% 
    cbind(b, .) 
+1

Vielen Dank, ich bevorzuge einen Weg, ohne ein anderes Paket zu verwenden. Die Ersatzfunktion ist, was ich gesucht habe. – DaReal

1

die dplyr Funktionen A etwas schneller (in Bezug auf die Eingabe, wenn es auch schneller in Bezug auf die Berechnung nicht sicher) Art und Weise als durch @akrun vorgeschlagen wird unter Verwendung der rec Funktion aus Das sjmisc -Paket:

library(sjmisc) 
library(dplyr) 

a <- data.frame(c(NA, 0,1), c(34,NA,0), c(3,9,NA)) 
b <- c('key1', 'key2', 'key3') 

a %>% 
    rec("NA=0;1=2;else=copy") %>% 
    rowSums(.) %>% 
    data_frame(key = b, val = .) 

# A tibble: 3 x 2 
#  key val 
# <chr> <dbl> 
# 1 key1 37 
# 2 key2  9 
# 3 key3  2 
+0

Danke, ich werde dies im Auge behalten, wenn ich eine größere Liste von Ersatzteilen habe. – DaReal