簡體   English   中英

如何更改R中數據框的形狀? (將具有相同名稱的列堆疊在一起)

[英]How to change the shape of a data frame in R? (stacking columns with the same names together)

我正在嘗試在 R 中重塑數據框:

  Gene_ID Value Gene_ID.1 Value.1 Gene_ID.2 Value.2
1       A     0         A       3         A       1
2       B     5         B       6         B       5
3       C     7         C       2         C       7
4       D     8         D       9         D       2
5       E     5         E       8         E       4
6       F     6         F       4         F       5

我想讓它看起來像這樣:

   Gene_ID Value
1        A     0
2        B     5
3        C     7
4        D     8
5        E     5
6        F     6
7        A     1
8        B     5
9        C     7
10       D     2
11       E     4
12       F     5
13       A     3
14       B     6
15       C     2
16       D     9
17       E     8
18       F     4

因此,只需將具有相同名稱的列堆疊在一起即可。 有沒有辦法這樣做? 謝謝!

您可以使用tidyr包中的gather()/spread()pivot_longer()的組合。

要了解有關新的pivot_xxx()函數的更多信息,請查看以下鏈接:

library(dplyr)
library(tidyr)

txt <- "  Gene_ID.0 Value.0 Gene_ID.1 Value.1 Gene_ID.2 Value.2
1       A     0         A       3         A       1
2       B     5         B       6         B       5
3       C     7         C       2         C       7
4       D     8         D       9         D       2
5       E     5         E       8         E       4
6       F     6         F       4         F       5"

dat <- read.table(text = txt, header = TRUE)

結合gather()separate()spread()函數

dat %>%
  mutate(Row_Nr = row_number()) %>%
  gather(key, value, -Row_Nr) %>%
  separate(key, into = c("key", "Gene_Nr"), sep = "\\.") %>% 
  spread(key, value) %>%
  select(-Row_Nr)
#> Warning: attributes are not identical across measure variables;
#> they will be dropped
#>    Gene_Nr Gene_ID Value
#> 1        0       A     0
#> 2        1       A     3
#> 3        2       A     1
#> 4        0       B     5
#> 5        1       B     6
#> 6        2       B     5
#> 7        0       C     7
#> 8        1       C     2
#> 9        2       C     7
#> 10       0       D     8
#> 11       1       D     9
#> 12       2       D     2
#> 13       0       E     5
#> 14       1       E     8
#> 15       2       E     4
#> 16       0       F     6
#> 17       1       F     4
#> 18       2       F     5

使用pivot_longer()

### gather all values columns
### separate original column names by the period "."
### into Gene_ID/Value and Gene_Nr
dat %>% 
  pivot_longer(everything(),
               names_to = c(".value", "Gene_Nr"),
               names_pattern = "(.*)\\.(.*)")
#>    Gene_Nr Gene_ID Value
#> 1        0       A     0
#> 2        1       A     3
#> 3        2       A     1
#> 4        0       B     5
#> 5        1       B     6
#> 6        2       B     5
#> 7        0       C     7
#> 8        1       C     2
#> 9        2       C     7
#> 10       0       D     8
#> 11       1       D     9
#> 12       2       D     2
#> 13       0       E     5
#> 14       1       E     8
#> 15       2       E     4
#> 16       0       F     6
#> 17       1       F     4
#> 18       2       F     5

reprex 包(v0.3.0) 於 2019 年 12 月 8 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM