2016-03-09 64 views
1

我慢慢地教自己R,在編程中有一個非常基本的背景。生產圖等是相對直接的,但我目前正在研究一小段代碼,目的是構建一個更大的腳本來處理商業化實驗室結果,這些腳本通常在相當混亂的CSV文件中發佈,不同濃度單位的混合物。R - 用if語句遍歷行

所以,我試圖產生一個代碼塊,它遍歷包含四個列標題的CSV文件的行:「分析物」,「單元」,「LOD」和「濃度」。我打算用於我的代碼來檢查被用於每個分析物,其單元,並且如果它是毫克/升,轉化爲微克/升此分析物的濃度:

input_file <- read.csv(file="test.csv", header = TRUE,sep = ",") 


apply(input_file, 1, function(row) { 
    if (input_file$Unit == "mg/l"){ 
    input_file$Concentration <- input_file$Concentration*1000 
    } 
    } 
) 

print(input_file) 

當運行該代碼(我使用Rstudio),我收到以下錯誤消息:In if (input_file$Unit == "mg/l") { : the condition has length > 1 and only the first element will be used。我找不到解決方案,而且我對編程術語的有限瞭解似乎阻礙了這一點。有任何想法嗎?任何建議,提示或資源將不勝感激。

回答

1

我相信這是你打算做的事:

apply(input_file, 1, function(row) { 
    if (row$Unit == "mg/l"){ 
     row$Concentration <- row$Concentration*1000 
    } 
}) 

臨時變量row表示輸入文件的每一行,而正是這其中你的意思修改。

這裏是這樣做更有效的方式:

input_file[input_file$Unit == "mg/l", "Concentration"] <- 
    input_file[input_file$Unit == "mg/l", "Concentration"]*1000 
+0

或許,'INPUT_FILE [INPUT_FILE $單位== 「毫克/升」,] $濃度< - INPUT_FILE [INPUT_FILE $單位==「毫克/ l「,] $ Concentration * 1000'? – SymbolixAU

+0

@Symbolix我的想法,謝謝你的評論。 –