2016-07-15 35 views
0

我現在感到非常愚蠢的一個數據幀的列的功能,但我不能拿出超過環...R:有效的方式來申請根據

我有一個數據幀帶有數字和因子欄。我只是想要縮放數字列,並保留階乘列。例如

> set.seed(160) 
> df1 <- data.frame(as.data.frame(matrix(rnorm(8), ncol=2)), 
        V3=factor(c("A", "A", "B", "B"))) 
> df1 
      V1   V2 V3 
1 0.6185496 -0.6410203 A 
2 -0.8722777 2.6520986 A 
3 0.8529240 -1.4156009 B 
4 0.3678875 -1.1615607 B 

我想獲得

> df1 
      V1   V2 V3 
1 0.4901808 -0.2642698 A 
2 -1.4493527 1.4780179 A 
3 0.7950968 -0.6740765 B 
4 0.1640750 -0.5396717 B 

用更高效的指揮比

for(i in 1:ncol(df1)) { 
    if(is.factor(df1[,i])) {df1[,i] <- df1[,i]} 
    else{df1[,i] <- scale(df1[,i])} 
} 

我試過的lapply(), sapply(), if(), ifelse()各種組合,但似乎沒有任何工作(apply沒有按」因爲df被轉換成矩陣,我失去了因子/數字結構)。有什麼建議麼?

注:我不嘗試應用基礎上,值的函數列而是基於類型列。

+2

'指數< - sapply(DF1,is.factor); df1 [index] < - scale(df1 [index])',但它仍然是無關緊要的;-) –

+0

OPS,我以爲我在SE上張貼;)謝謝! – jeiroje

回答

1

你可以嘗試以下方法,這是類似的意見建議:

df1[sapply(df1, is.numeric)] <- scale(df1[sapply(df1, is.numeric)]) 
#> df1 
#   V1   V2 V3 
#1 0.4901808 -0.2642698 A 
#2 -1.4493527 1.4780179 A 
#3 0.7950968 -0.6740765 B 
#4 0.1640750 -0.5396717 B 
0

這應該工作。

df1[] <- sapply(df1, function(i) if(is.numeric(i)) scale(i) else i)