将每列中的字符串拆分为多列
Split string in each column for several columns
我有这个 table (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 中的解决方案,使其成为管道的一部分。
我忘了说我需要将其应用于一百万列。
这直接使用 splitstackshape::cSplit
函数。只需在 splitCols
参数中指定列索引,并在 sep
参数中指定分隔符,即可完成。它甚至会为您的新列名称编号,以便您能够区分它们。我已指定 type.convert = FALSE
,因此 T
值不会变为 TRUE
。默认方向为wide
,无需指定。
library(splitstackshape)
cSplit(data1, 2:4, sep = "-", type.convert = FALSE)
# SNP rs6576700_1 rs6576700_2 rs17054099_1 rs17054099_2 rs7730126_1 rs7730126_2
# 1: sample1 G G T T G G
这是根据提供的 link 使用 devel version of data.table
on GH 的 tstrsplit
函数的解决方案。在这里,我们将首先通过分租列名来定义索引,然后我们将使用 paste
对它们进行编号。这是一种更麻烦的方法,但它的优点是它会更新你的原始数据而不是创建整个数据的副本
library(data.table) ## V1.9.5+
indx <- names(data1)[2:4]
setDT(data1)[, paste0(rep(indx, each = 2), 1:2) := sapply(.SD, tstrsplit, "-"), .SDcols = indx]
data1
# SNP rs6576700 rs17054099 rs7730126 rs65767001 rs65767002 rs170540991 rs170540992 rs77301261 rs77301262
# 1: sample1 G-G T-T G-G G G T T G G
此处您想对行而非列使用应用:
df <- rbind(c("SNP", "rs6576700", "rs17054099", "rs7730126"),
c("sample1", "G-G", "T-T", "G-G"),
c("sample2", "C-C", "T-T", "G-C"))
t(apply(df[-1,], 1, function(col) unlist(strsplit(col, "-"))))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] "sample1" "G" "G" "T" "T" "G" "G"
#[2,] "sample2" "C" "C" "T" "T" "G" "C"
我有这个 table (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 中的解决方案,使其成为管道的一部分。
我忘了说我需要将其应用于一百万列。
这直接使用 splitstackshape::cSplit
函数。只需在 splitCols
参数中指定列索引,并在 sep
参数中指定分隔符,即可完成。它甚至会为您的新列名称编号,以便您能够区分它们。我已指定 type.convert = FALSE
,因此 T
值不会变为 TRUE
。默认方向为wide
,无需指定。
library(splitstackshape)
cSplit(data1, 2:4, sep = "-", type.convert = FALSE)
# SNP rs6576700_1 rs6576700_2 rs17054099_1 rs17054099_2 rs7730126_1 rs7730126_2
# 1: sample1 G G T T G G
这是根据提供的 link 使用 devel version of data.table
on GH 的 tstrsplit
函数的解决方案。在这里,我们将首先通过分租列名来定义索引,然后我们将使用 paste
对它们进行编号。这是一种更麻烦的方法,但它的优点是它会更新你的原始数据而不是创建整个数据的副本
library(data.table) ## V1.9.5+
indx <- names(data1)[2:4]
setDT(data1)[, paste0(rep(indx, each = 2), 1:2) := sapply(.SD, tstrsplit, "-"), .SDcols = indx]
data1
# SNP rs6576700 rs17054099 rs7730126 rs65767001 rs65767002 rs170540991 rs170540992 rs77301261 rs77301262
# 1: sample1 G-G T-T G-G G G T T G G
此处您想对行而非列使用应用:
df <- rbind(c("SNP", "rs6576700", "rs17054099", "rs7730126"),
c("sample1", "G-G", "T-T", "G-G"),
c("sample2", "C-C", "T-T", "G-C"))
t(apply(df[-1,], 1, function(col) unlist(strsplit(col, "-"))))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] "sample1" "G" "G" "T" "T" "G" "G"
#[2,] "sample2" "C" "C" "T" "T" "G" "C"