[英]How to split the column of a matrix into two columns?
我有矩阵,矩阵的其中一列具有以“,”分隔的ID。 我只想将该Cloumn分成两列,而每个新列只有一部分ID。 最简单的方法是什么?
我的矩阵是:
> L
a u
[1,] "10" "mature,MIMAT0000062"
[2,] "20" "stemloop"
[3,] "40" "mature,MIMAT0000062"
预期的输出是:
> k
a u v
[1,] "10" "mature" "MIMAT0000062"
[2,] "20" "stemloop" "NA"
[3,] "40" "mature" "MIMAT0000062"
>
编辑:
现在,我必须根据具有“ NA”值的列将该矩阵分为两个矩阵,一个矩阵全为“ NA”,另一个矩阵全为“ NA”。
输入:
>k
a u v
[1,] "10" "mature" "MIMAT0000062"
[2,] "20" "stemloop" "NA"
[3,] "40" "mature_2" "MIMAT0000043"
输出应该像
>k1
a u v
[1,] "10" "mature" "MIMAT0000062"
[2,] "40" "mature_2" "MIMAT0000043"
>k2
a u v
[1,] "20" "stemloop" "NA"
我有一个名为cSplit
的函数 , 该函数非常快,可以非常轻松地处理这些类型的问题。
以下是使用中的函数的一些示例,以及要考虑的一些不同情况:
您现有的样本数据:
M1 <- cbind(a = c(10,20,40),
u = c("mature,MIMAT0000062",
"stemloop", "mature,MIMAT0000062"))
cSplit(data.frame(M1), "u", ",")
# a u_1 u_2
# 1: 10 mature MIMAT0000062
# 2: 20 stemloop NA
# 3: 40 mature MIMAT0000062
一个“ u”值,以逗号开头:
M2 <- cbind(a = c(10,20,40),
u = c(",MIMAT0000062",
"stemloop", "mature,MIMAT0000062"))
cSplit(data.frame(M2), "u", ",")
# a u_1 u_2
# 1: 10 MIMAT0000062
# 2: 20 stemloop NA
# 3: 40 mature MIMAT0000062
一个“ u”值,分为3列:
M3 <- cbind(a = c(10,20,40),
u = c("mature,MIMAT0000062",
"stemloop,,something", "mature,MIMAT0000062"))
cSplit(data.frame(M3), "u", ",")
# a u_1 u_2 u_3
# 1: 10 mature MIMAT0000062 NA
# 2: 20 stemloop something
# 3: 40 mature MIMAT0000062 NA
这些值用逗号分隔时有效:
sep_cols = matrix(unlist(strsplit(as.character(L$u), ",")), ncol = 2)
new_L = cbind(L, sep_cols)
一种不同的方式
a <- c(10,20,40)
u <- c("mature,MIMAT0000062", "stemloop", "mature,MIMAT0000062")
L <- data.frame(a,u) #better use a data.frame
v <- strsplit(as.character(L$u), ",")
L$u <- sapply(v, `[`, 1)
L$v <- sapply(v, `[`, 2)
> L
# a u v
#1 10 mature MIMAT0000062
#2 20 stemloop <NA>
#3 40 mature MIMAT0000062
两个内胆:
L$v =sapply(strsplit(as.character(L$u),","), "[", 2)
L$u =sapply(strsplit(as.character(L$u),","), "[", 1)
#L
# a u v
#1 10 mature MIMAT0000062
#2 20 stemloop <NA>
#3 40 mature MIMAT0000062
另一个使用reshape2::colsplit
替代方法,如joran建议的那样:
library(reshape2)
k = cbind(a =L$a,colsplit(L$u,",",c("u","v")))
#k
# a u v
#1 10 mature MIMAT0000062
#2 20 stemloop
#3 40 mature MIMAT0000062
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.