首页 > 解决方案 > 在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")

标签: r

解决方案


这可能会完成您想要的,但首先我们需要一个可重现的示例:

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”添加到以数字开头的任何列名。


推荐阅读