2016-04-28 46 views
-1

我需要將轉換應用於大型數據框的所有數值變量。數據框也有其他類型的變量。我最初的想法是遍歷所有列,檢查它們是否數值,然後通過1000用函數轉換數據幀中的所有數值變量

我被困在我的代碼的功能劃分他們,希望得到一些指點的位置:

transformDivideThousand <- function(data_frame){ 
    for(i in ncol(data_frame)){ 
     if (is.numeric(data_frame[i])) { 
      data_frame[i]/1000 
     } 
    } 
    return(data_frame) 
} 

功能的執行:

test <- transformDivideThousand(mypatients) 
  • 測試是一個數據框,但轉換是沒有發生。我在哪裏犯錯?
  • 作爲一個額外的,我也想transformDivideThousand有一個可選的參數,我可以傳遞一個列表的名稱爲變量使用,如果是空的,比迭代所有的。
+5

您必須將結果重新分配到循環中。 'data_frame [[I]] < - data_frame [[I]]/1000'。使用雙方括號來提取一列;你應該學習'['和'[[''的區別。例如,'is.numeric(data_frame [i])'幾乎不會返回'TRUE'。此外,循環沒有正確定義;應該是'for(i in 1:ncol(data_frame))',否則只考慮最後一列。 – nicola

回答

4

@ nicola的評論解釋了你的循環出了什麼問題。另一種選擇是使用sapply來標識數字列,這會產生更簡潔的代碼。例如,使用內置iris數據幀:

iris[, sapply(iris, is.numeric)] = 
     iris[, sapply(iris, is.numeric)]/1000 

你可以只在數據幀上直接運行它,如上,或把它放在一個函數裏面:

tDT <- function(data_frame) { 

    data_frame[, sapply(data_frame, is.numeric)] = 
    data_frame[, sapply(data_frame, is.numeric)]/1000 

    return(data_frame) 

} 

然後,運行:

iris.new = tDT(iris) 

以供將來參考,每@ Nicola的評論,這裏是如何使for循環版本工作:

tDT2 <- function(data_frame) { 

    for (i in 1:ncol(data_frame)) { 
    if (is.numeric(data_frame[,i])) { 
     data_frame[,i] = data_frame[,i]/1000 
    } 
    } 
    return(data_frame) 
} 
相關問題