将列名或例外更改为strsplit

时间:2014-01-03 16:43:34

标签: r

我有一个数据帧基因型,它有标记为D2S1338,D2S1338.1,CSF1PO,CSF1PO.1,Penta.D,Penta.D.1的基因座列。当我将Excel电子表格导入R时,这些名称是自动生成的,因为标记为CSF1PO的两列,具有第一组等位基因的列标记为CSF1PO,第二列标记为CSF1PO.1。这个工作正常,直到我到达Penta D,它在Excel中以空格列出并作为Penta.D导入。当我应用以下代码时,Penta.D与Penta.C和Penta.E合并,给我无意义的结果:

locuses = unique(unlist(lapply(strsplit(names(Freqs), ".", fixed=TRUE), function(x) x[1]))) 
Expected <- sapply(locuses, function(x) 1 - sum(unlist(Freqs[grepl(x, names(Freqs))])^2))

此代码适用于除Pentas之外的所有基因座,因为它们是自动命名的。如何在Penta.C,Penta.D和Penta.E中为strsplit编写例外或将这些名称更改为PentaC,PentaD和PentaE,以便上述代码按预期工作?我运行以下行:

Genotypes <- transform(Genotypes, rename.vars(Genotypes, from="Penta.C", to="PentaC", info=TRUE))

它告诉我:

Changing in Genotypes             
From: Penta.C
To:   PentaC 

但是当我查看基因型时,它仍然将我的Penta基因座写为Penta.C。我认为这个函数会将它写回原始数据框,而不仅仅是副本。我在这里错过了什么?谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

代码的第一行是将变量名拆分为。并提取第一块。听起来你反而希望分开。并提取除最后一个之外的所有部分:

locuses = unique(unlist(lapply(strsplit(names(Freqs), ".", fixed=TRUE),
                               function(x) paste(x[1:(length(x)-1)], collapse=""))))

答案 1 :(得分:0)

看起来你想删除“.n”,其中n是单个数字,当且仅当它出现在一行的末尾。

loci.columns <- read.table(header=F, 
                           text="D2S1338,D2S1338.1,CSF1PO,CSF1PO.1,Penta.D,Penta.D.1", 
                           sep=",")

loci <- gsub("\\.\\d$",replace="",unlist(loci.columns))
loci
# [1] "D2S1338" "D2S1338" "CSF1PO"  "CSF1PO"  "Penta.D" "Penta.D"
loci <- unique(loci)
loci
# [1] "D2S1338" "CSF1PO"  "Penta.D"

gsub(...)中,\\.匹配“。”,\\d匹配任何数字,$强制匹配位于该行的末尾。

答案 2 :(得分:0)

基本问题似乎是make.names函数导入时名称变为“有效”

> make.names("Penta C")
[1] "Penta.C"

使用check.names=FALSE read.table参数避免R的列重新命名。如果您明确引用列,则需要提供反向引用的字符串

df$`Penta C`