2013-12-09 99 views
1

我正在使用R來嘗試將for循環的結果寫入到我在數據框中創建的列中。我的額外列是hetCSF在我的數據框中的基因型,我試圖給它分配一個默認值0. for循環應該比較我的數據框中的每個1036行的2列,如果兩個數據條目返回值1是相同的,如果不是,則爲0。有人可以看看這段代碼,告訴我我做錯了什麼嗎?將for循環寫入列的結果

Heterozygosity <- function (Genotypes$CSF1PO, Genotypes$CSF1PO.1){ 
    Genotypes$hetCSF <- 0 #gives Genotypes$hetCSF a default value of 0 which corresponds to heterozygous 
    for (i in 1:nrow(Genotypes)){ #loops the following across all rows 
    Genotypes$hetCSF <- as.numeric(identical(Genotypes[i, "CSF1PO"], Genotypes[i, "CSF1PO.1"])) #decides if the 2 columns have the same value and are therefore homozygous, returns 1 for homozygous in new column homCSF.G 
    } 
} 

目前,當我運行它時,它告訴我我有一個unexpected '$' in "Heterozygosity <- function Genotypes$" and an unexpected '}' in "}"。非常感謝你的幫助。我對R很新,所以我很抱歉,如果這是一個非常基本的問題。

回答

3

一種更簡單的方法是

Genotypes <- transform(Genotypes, hetCSF = as.integer(CSF1PO == CSF1PO.1)) 
+0

非常感謝您,它的工作方式就像一個魅力!我之前並不熟悉轉換函數。 – user3083973

1

另一種方式做同樣的事情:

Genotypes$hetSCF <- with(Genotypes, as.integer(CSF1PO == CSF1PO.1)) 

,或者更長一點:

Genotypes$hetSCF <- as.integer(Genotypes$CSF1PO == Genotypes$CSF1PO.1) 

FWIW:既然你是新到R,這個原理的工作原理是R是向量化的,這意味着(幾乎)所有東西都被當作一個向量。所以你幾乎不需要循環遍歷行。因此,(x==y)將返回T或F值的向量,取決於x和y中的對應元素是否相等。函數as.integer(...)(在這種情況下)接受一個向量參數並返回一個新的向量,其中T轉換爲1,而F轉換爲0.

+0

感謝您的幫助。這比我原來寫的要乾淨得多。我仍然在學習在矢量化環境中工作的含義。我一直假設每一行都被視爲一個向量,但同樣的情況並不適用於列。我感謝您的幫助。 – user3083973