r - 在R中将2行矩阵变成一行和一列
问题描述
我正在使用 R 我有一个来自像这样的单个单元格数据的 csv 文件,其中所有唯一的“基因”列都重复了“集群”列。
dput(markers)
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene
APOC1 0 1.696639642 0.939 0.394 0 0 APOC1
APOE 0 1.487160872 0.958 0.475 0 0 APOE
GPNMB 9.30E-269 1.31714457 0.745 0.301 2.49E-264 0 GPNMB
FTL 2.24E-230 0.766844152 1 0.977 6.00E-226 0 FTL
PSAP 2.27E-225 0.98726538 0.925 0.685 6.07E-221 0 PSAP
CTSB 4.84E-211 0.925031015 0.902 0.606 1.29E-206 0 CTSB
CTSS 1.37E-197 0.898457063 0.869 0.609 3.67E-193 0 CTSS
CSTB 8.05E-191 0.853658991 0.918 0.732 2.15E-186 0 CSTB
CTSD 1.23E-187 1.08931251 0.787 0.443 3.30E-183 0 CTSD
IGKC 0 1.560337702 0.998 0.237 0 1 IGKC
IGLC2 0 1.546344857 0.997 0.152 0 1 IGLC2
IGLC3 0 1.342649567 0.967 0.073 0 1 IGLC3
C11orf96 0 1.245172517 0.99 0.253 0 1 C11orf96
COL3A1 0 1.212528128 1 0.343 0 1 COL3A1
LUM 0 1.202452925 0.971 0.143 0 1 LUM
IGHG4 0 0.977399051 0.876 0.092 0 1 IGHG4
HSPG2 0 0.957478533 0.883 0.148 0 1 HSPG2
NNMT 0 0.952577589 0.945 0.213 0 1 NNMT
IGHG1 0 0.913733424 0.861 0.07 0 1 IGHG1
COL6A31 0 1.847828827 0.907 0.192 0 2 COL6A3
PDGFRA 5.38E-292 0.849349193 0.503 0.052 1.44E-287 2 PDGFRA
COL5A21 2.67E-280 1.400314195 0.649 0.105 7.14E-276 2 COL5A2
CALD1 1.11E-275 1.292924443 0.771 0.155 2.98E-271 2 CALD1
CCDC80 1.73E-271 1.168549626 0.706 0.123 4.64E-267 2 CCDC80
COL1A21 1.66E-268 2.004626869 0.966 0.326 4.45E-264 2 COL1A2
DCN1 1.47E-253 1.540631398 0.886 0.254 3.93E-249 2 DCN
COL3A11 3.88E-253 2.216642854 0.955 0.353 1.04E-248 2 COL3A1
FBN1 6.40E-251 0.949521182 0.525 0.07 1.71E-246 2 FBN1
我想转换我的矩阵,使行名称是唯一的集群名称,并且每一列都有来自该集群名称的所有基因(图 2)。我应该如何编写代码?
dput(markers)
0 1 2
APOC1 IGKC COL6A3
APOE IGLC2 PDGFRA
GPNMB IGLC3 COL5A2
FTL C11orf96 CALD1
PSAP COL3A1 CCDC80
CTSB LUM COL1A2
CTSS IGHG4 DCN
CSTB HSPG2 COL3A1
CTSD NNMT FBN1
我试过了,结果文件没有值。
markers = read.csv("./markers.csv", row.names=1, stringsAsFactors=FALSE)
z1 = matrix("", ncol = length(unique(markers$cluster)))
colnames(z1) = unique(markers$cluster)
for (i in 1:nrow(z1)){
for (j in 1:ncol(z1)){
genes1 = as.character(markers$gene)[markers$cluster == rownames(z1)[i]]
z1[i,0] = paste(genes1, collapse=" ")
z1 = matrix("", ncol = length(unique(markers$cluster)))
colnames(z1) = unique(markers$cluster)
for (i in 1:nrow(z1)){
for (j in 1:ncol(z1)){
genes1 = as.character(markers$gene)[markers$cluster == rownames(z1)[i]]
z1[i,0] = paste(genes1, collapse=" ")
}
}
write.csv(z1, "test.csv")
解决方案
这可能会完成您想要的,但首先我们需要一个可重现的示例:
set.seed(42)
cluster <- c(rep(0, 8), rep(1, 10), rep(2, 12))
gene <- replicate(30, paste0(sample(LETTERS, 4), collapse=""))
markers <- data.frame(cluster, gene, stringsAsFactors=FALSE)
该数据框仅包含您感兴趣的两列。我们需要将数据框按基因拆分:
markers.split <- split(markers$gene, markers$cluster)
把这个打印出来。它是一个包含 3 个字符向量的列表,一个用于 0、1 和 2。您想要的表格格式的问题是表格和矩阵必须在每列中具有相同的行数。我们必须填充向量,使它们都与最长的向量一样长(在本例中为 12):
rows <- max(sapply(markers.split, length))
markers.sp <- lapply(markers.split, function(x) c(x, rep("", rows - length(x))))
markers.df <- do.call(data.frame, list(markers.sp, stringsAsFactors=FALSE))
markers.df
# X0 X1 X2
# 1 QEAJ ZHDX TIKC
# 2 DRQO VRME PEXN
# 3 XGDE DBXR EVBR
# 4 NTRO CXWQ XQRE
# 5 CIDE URFX NHWY
# 6 METB BTCV UDYG
# 7 HCAJ UBWF JRMU
# 8 XKOV ZJHE VSPZ
# 9 AQGD QLIU
# 10 MJIL KYPH
# 11 WFAM
# 12 NEIW
R 自动将“X”添加到以数字开头的任何列名。
推荐阅读
- performance - Cloudflare 导致请求缓慢
- java - 将 imageView 放在另一个中间
- security - PasswordVault 如何保护密码?
- openshift - 启用 minishift/cdk 指标
- vba - VBA 中的后期绑定与早期绑定 - (CreateObject() vs New)
- machine-learning - ANNs CNNs 和 MLPs 中隐藏层之间的层间缩放或归一化
- html - 元素位置固定受限
- optimization - 使用 AVX2 指令选择性地异或列表的元素
- javascript - findIndex 返回 -1,但它应该返回 0
- security - 用于不安全 WebSocket 服务器的安全 WebSocket 代理