2013-12-09 101 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