如何将两列中的所有值堆叠到一列中

How to stack all values in two columns into a single column

我有这样的数据集:

 dt <- tibble(
  TRIAL = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
  GYF = c(1, 2, 3, 1, 6, 3, 2, 3, 1),
  AD = c(7.54, 1.564, 10, 0.89, 0, , , 1.5, 0)
)
 




# # A tibble: 9 x 3
#   TRIAL    GYF    AD
#   <chr> <dbl> <dbl>
# 1 A         1   7.54  
# 2 A         2   1.564
# 3 A         3   10  
# 4 B         1   0  .89
# 5 B         6   0  
# 6 B         3     
# 7 C         2     
# 8 C         3   1.5
# 9 C         1   0  

这就是我想要实现的:我希望堆叠所有 GYF 和 AD 列的值,并在第一列中包含 Header 和试用值。

# # A tibble: 9 x 4
#   TRIAL    Trait    Traitvalue
#   <chr> <chr> <dbl> 
# 1 A        GYF   1
# 2 A        GYF   2
# 3 A        GYF   3
# 4 A        AD   7.54
# 5 A        AD   1.564
# 6 A        AD   10
# 7 B        GYF   1
# 8 B        GYF   6
# 9 B        GYF   3
# 10 B      AD   0.89
# 11 B      AD    0
# 12 B      AD    
# 13 C      GYF   2      
# 14 C      GYF  3    1.5
# 15 C      GYF  1     0
# 16 C      AD 
# 17 C      AD 1.5
#18 C       AD 0

您可以使用函数 melt(但它可以与 data.frame 一起正常工作):

melt(as.data.frame(dt), id.vars = "TRIAL", variable_name = "Trait")

如果您想对其进行排序(如您的示例),您可以使用 arrange:

... %>% arrange(TRIAL)

您可以使用 tidyr 和 dplyr 管道中的 pivot_longer 进行重命名和排序:

dt %>% pivot_longer(., c("GYF", "AD")) %>% 
  arrange(., TRIAL, name) %>% 
  rename(Traitvalue=value,
         Trait=name)

  TRIAL Trait Traitvalue
   <chr> <chr>      <dbl>
 1 A     AD          7.54
 2 A     AD          1.56
 3 A     AD         10   
 4 A     GYF         3   
 5 A     GYF         2   
 6 A     GYF         3   
 7 B     AD          0.89
 8 B     AD         NA   
 9 B     AD         NA   
10 B     GYF         1   
11 B     GYF         6   
12 B     GYF         3   
13 C     AD          1   
14 C     AD          1.5 
15 C     AD          0   
16 C     GYF         2   
17 C     GYF         3   
18 C     GYF         1