【问题标题】:reshape a data.frame based on similar value in one column根据一列中的相似值重塑 data.frame
【发布时间】:2017-10-26 13:21:52
【问题描述】:

我有一个data.frame 有 2 列,其中第二列中的值重复。例如:

     HUGO                     Cell
1    CD28                 T cells
2    CD3D                 T cells
3    CD3G                 T cells
4    CD8A                lymphocytes
5    EOMES               lymphocytes
6    FGFBP2              lymphocytes
7    GNLY                lymphocytes
8    NCR1                 NK cells
9    PTGDR                NK cells
10   SH2D1B               NK cells

我希望 HUGO 列中与列单元格中唯一名称相对应的所有值在每个唯一名称之后进入名称列表。

例如

T cells: CD28     CC3D     C34
lymphocytes: CD8A    EOMES    FGFBP2  FGFBP2    GNLY 
... 

我试过了
reshape(data.frame, timevar = "HUGO",idvar = "Cell",direction = "wide") 但它只返回 Cell 列中每个名称的值的数量。

【问题讨论】:

  • split(df$HUGO, df$Cell).

标签: r dataframe reshape tidyr


【解决方案1】:

这里有一些可能性取决于你想要什么。前 5 个不使用任何包。

1) aggregate/c 这给出了一个数据框,其第二列是 HUGO 名称的字符向量。

aggregate(HUGO ~ Cell, DF, c)

给予:

         Cell                      HUGO
1 lymphocytes CD8A, EOMES, FGFBP2, GNLY
2    NK cells       NCR1, PTGDR, SH2D1B
3     T cells          CD28, CD3D, CD3G

2) aggregate/toString 这给出了一个数据框,其第二列包含用逗号分隔 HUGO 名称的字符串。

aggregate(HUGO ~ Cell, DF, toString)

给予:

         Cell                      HUGO
1 lymphocytes CD8A, EOMES, FGFBP2, GNLY
2    NK cells       NCR1, PTGDR, SH2D1B
3     T cells          CD28, CD3D, CD3G

3) unstack 这给出了一个列表,每个 Cell 一个组件,其组件是该 Cell 的每个 HUGO 名称。

unstack(DF)

给予:

$lymphocytes
[1] "CD8A"   "EOMES"  "FGFBP2" "GNLY"  

$`NK cells`
[1] "NCR1"   "PTGDR"  "SH2D1B"

$`T cells`
[1] "CD28" "CD3D" "CD3G"

4) tapply 这给出了一个矩阵,其行是单元格,其列是 HUGO 名称的序数。

DF2 <- transform(DF, seq = ave(seq_along(HUGO), Cell, FUN t= seq_along))
tapply(DF2$HUGO, DF2[-1], c)

给予:

             seq
Cell          1      2       3        4     
  lymphocytes "CD8A" "EOMES" "FGFBP2" "GNLY"
  NK cells    "NCR1" "PTGDR" "SH2D1B" NA    
  T cells     "CD28" "CD3D"  "CD3G"   NA   

5) reshape 这使用了最后一个替代方案中的DF2reshape 来给出一个数据框:

reshape(DF2, timevar = "seq", idvar = "Cell", dir = "wide")

给予:

         Cell HUGO.1 HUGO.2 HUGO.3 HUGO.4
1     T cells   CD28   CD3D   CD3G   <NA>
4 lymphocytes   CD8A  EOMES FGFBP2   GNLY
8    NK cells   NCR1  PTGDR SH2D1B   <NA>

6) spread 这给出了一个"tbl_df" 类对象作为输出(它是"data.frame" 的子类)

library(dplyr)
library(tidyr)

DF %>% 
   group_by(Cell) %>%
   mutate(seq = 1:n()) %>%
   ungroup() %>%
   spread(seq, HUGO)

给予:

         Cell    1     2      3    4
1 lymphocytes CD8A EOMES FGFBP2 GNLY
2    NK cells NCR1 PTGDR SH2D1B <NA>
3     T cells CD28  CD3D   CD3G <NA>

7) read.zoo read.zoo 给出一个动物园对象,其时间是单元格。
由于时间实际上是字符串,我们使用FUN=identity 来避免解释。 fortify.zoo 将其转换为数据框。 DF2 来自上方。

library(zoo)

fortify.zoo(read.zoo(DF2, split = "seq", index = "Cell", FUN = identity))

给予:

       Index    1     2      3    4
1 lymphocytes CD8A EOMES FGFBP2 GNLY
2    NK cells NCR1 PTGDR SH2D1B <NA>
3     T cells CD28  CD3D   CD3G <NA>

8) dcast 这给出了一个 data.table 作为输出。

library(data.table)

DT <- data.table(DF)
DT[, seq:=1:.N, by = Cell]
dcast(DT, Cell ~ seq, value.var = "HUGO")

给予:

          Cell    1     2      3    4
1:    NK cells NCR1 PTGDR SH2D1B   NA
2:     T cells CD28  CD3D   CD3G   NA
3: lymphocytes CD8A EOMES FGFBP2 GNLY

注意:

DF <- structure(list(HUGO = c("CD28", "CD3D", "CD3G", "CD8A", "EOMES", 
"FGFBP2", "GNLY", "NCR1", "PTGDR", "SH2D1B"), Cell = c("T cells", 
"T cells", "T cells", "lymphocytes", "lymphocytes", "lymphocytes", 
"lymphocytes", "NK cells", "NK cells", "NK cells")), .Names = c("HUGO", 
"Cell"), class = "data.frame", row.names = c(NA, -10L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多