我有一个数据帧基因型,它有标记为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。我认为这个函数会将它写回原始数据框,而不仅仅是副本。我在这里错过了什么?谢谢你的帮助。
答案 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`