【发布时间】:2015-11-07 01:21:58
【问题描述】:
我有这个表(data1)有四列
SNP rs6576700 rs17054099 rs7730126
sample1 G-G T-T G-G
我需要将 2-4 列分别分成两列,因此新输出有 7 列。像这样:
SNP rs6576700 rs6576700 rs17054099 rs17054099 rs7730126 rs7730126
sample1 G G T T C C
使用以下函数,我可以同时拆分所有列,但输出不是我需要的。
split <- function(x){
x <- as.character(x)
strsplit(as.character(x), split="-")
}
data2=apply(data1[,-1], 2, split)
data2
$rs17054099
$rs17054099[[1]]
[1] "T" "T"
$rs7730126
$rs7730126[[1]]
[1] "G" "G"
$rs6576700
$rs6576700[[1]]
[1] "C" "C"
在 Stack Overflow 中,我找到了一种将 strsplit 的输出转换为数据帧的方法,但 rs 数字是在行中而不是在列中(我在这个线程中得到了与其他方法类似的输出 strsplit by row and distribute results by column in data.frame)
> n <- max(sapply(data2, length))
> l <- lapply(data2, function(X) c(X, rep(NA, n - length(X))))
> data.frame(t(do.call(cbind, l)))
t.do.call.cbind..l..
rs17054099 T, T
rs7730126 G, G
rs2061700 C, C
如果我不使用函数 transpose (...(t(do.call...),输出是我无法写入文件的列表。
我想在 R 中提供解决方案,使其成为管道的一部分。
我忘了说我需要将此应用于一百万列。
【问题讨论】:
-
您希望如何区分具有相同名称的列? ——提示:你不能。首先,您需要定义明确的列名。
-
最后我不会使用标题。我想首先确定 SNP 的顺序。我可以添加 rs17054099.1 和 rs17054099.2。我需要创建一个 plink ped 文件,然后我将添加每个样本的信息(FID、IDD 等)。感谢您对我的问题感兴趣。萨米人
-
好的,谢谢你的建议。如果列的顺序不改变标题并不重要。
-
This question is already answered here。 Data.table 也是一种非常快速的大数据解决方案。
-
@DavidArenburg 很高兴知道。自己没试过。我得再仔细看看。我在想
lapply-tstrsplit组合。当然cSplit更直接。