2016-07-27 14 views
2

Ich habe Variablen für meine Daten wahrscheinlich etwas schwieriger transformiert, als ich sollte. Was ist eine effizientere Möglichkeit, Batch-Variablen zu transformieren? Zum Beispiel:R Was ist der beste Weg, um mehrere Variablen zu transformieren?

log_vw = log(msft$vwretd) 
log_ew = log(msft$ewretd) 
log_sp = log(msft$sprtrn) 
log_msft = log(msft$msft) 

msft["log_vw"] <- log_vw 
msft["log_ew"] <- log_ew 
msft["log_sp"] <- log_sp 
msft["log_msft"] <- log_msft 
head(msft) 

Ich habe mit dieser Methode versucht, aber ich erhalte ein paar Fehler auf dem Weg ..

cols <- c("msft$vwretd","msft$ewretd","msft$sprtrn","msft$msft") 
df[cols] <- log(cols) 

In diesem letzten Beispiel, ich versuche zu setzen nicht-numerische Argumente in einer mathematischen Funktion, so dass es Sinn macht.

Ich verstehe die für Aussage ist die entsprechende Aussage, aber bin mir nicht sicher, wie man meinen Befehl strukturiert.

Alle Empfehlungen würden geschätzt. Vielen Dank.

+2

Blick auf 'lapply' – dayne

+1

Yep @dayne richtig ist, versuchen so etwas wie' cols <- c ("vwretd", "ewretd", "sprtrn", "MSFT"); msft [cols] <- lapply (msft [cols], log) ' – thelatemail

Antwort

3

Wenn Sie ein Fan von dplyr sind, können Sie auch tun,

dplyr::mutate_each(msft, funs(log), 
        log_vw = vwretd, 
        log_ew = ewretd, 
        log_sp = sprtrn, 
        log_msft = msft) 

Ausgang:

library(dplyr) 

data.frame(vwretd = runif(10), ewretd = runif(10), sprtrn = runif(10), msft = runif(10)) %>% 
    mutate_each(funs(log), log_vw = vwretd, log_ew = ewretd, log_sp = sprtrn, log_msft = msft) 

     vwretd ewretd  sprtrn  msft  log_vw  log_ew  log_sp log_msft 
1 0.54274693 0.1263857 0.88601706 0.458666312 -0.6111121 -2.06841664 -0.1210191 -0.7794323 
2 0.44335175 0.5799405 0.05000435 0.004620247 -0.8133918 -0.54482978 -2.9956452 -5.3773070 
3 0.10626751 0.6079891 0.77995001 0.474660813 -2.2417957 -0.49759827 -0.2485255 -0.7451548 
4 0.56562366 0.7637879 0.03525097 0.199729556 -0.5698263 -0.26946509 -3.3452623 -1.6107910 
5 0.39274678 0.7384458 0.62834120 0.888230976 -0.9345902 -0.30320757 -0.4646719 -0.1185235 
6 0.04751128 0.5708233 0.53730398 0.425984998 -3.0467881 -0.56067550 -0.6211913 -0.8533511 
7 0.57159055 0.9290444 0.31881544 0.679257606 -0.5593324 -0.07359875 -1.1431429 -0.3867548 
8 0.10841133 0.9730511 0.26677617 0.097040692 -2.2218227 -0.02731870 -1.3213453 -2.3326249 
9 0.17500813 0.3787455 0.14860983 0.480663703 -1.7429229 -0.97089076 -1.9064310 -0.7325874 
10 0.89509921 0.4091091 0.79529002 0.681128521 -0.1108207 -0.89377335 -0.2290484 -0.3840043 
+0

Ich installiere gerade dplyr. Danke für die Anleitung. – Starbucks

+2

'mutate_each' wird veraltet sein. Verwenden Sie stattdessen "mutate_all" oder "mutate_at" statt – Sumedh

+0

Interessant. Danke für die Bemerkung! –

0

Danke @ Dayne und @thelatemail. Das macht, was ich brauche. Vielen Dank.

cols <- c("vwretd","ewretd","sprtrn","msft") 
msft[cols] <- lapply(msft[cols], log) 
0

Hier ist eine Option mit data.table. Konvertieren Sie 'data.frame' in 'data.table' (setDT(msft)), geben Sie die 'cols' in .SDcols ein, durchlaufen Sie die Subset of Data.table (.SD), rufen Sie log ab und weisen Sie den neuen Ausgang dem neuen Ausgang zu (:=10) Säulen (paste0("log_",cols)).

library(data.table) 
cols <- c("vwretd","ewretd","sprtrn","msft") 
setDT(msft)[, paste0("log_", cols) := lapply(.SD, log), .SDcols = cols]