首页 > 解决方案 > 将行和列标题作为变量包含在 R 中的数据集中

问题描述

我有一组数据,其中实验室测试类型作为行名,日期作为列名。我想转换此表,以便名称中的每个值都有实验室测试和日期。例如:

             2017-01-01       2017-01-15
calcium      80               91
glucose      67               69
Neutrophils  3500             3812
Platlets     391653           370108
Lymphocytes  1839             2008

我想将此表转换为以下内容:

calcium        2017-01-01    80
glucose        2017-01-01    67
neutrophils    2017-01-01    3500
platlets       2017-01-01    391653
lymphocytes    2017-01-01    1839
calcium        2017-01-15    91
glucose        2017-01-15    69
neutrophils    2017-01-15    3812 
platlets       2017-01-15    370108
lymphocytes    2017-01-15    2008

有 100 多个日期和 50 多个测试,因此手动完成这将花费太长时间。有谁知道可以在线执行此操作的功能或工具?

标签: rdplyrtidyrstringr

解决方案


这是一个tidyverse解决方案。首先,我创建数据框。

# Create data frame
df <- read.table(text = "             2017-01-01       2017-01-15
calcium      80               91
                 glucose      67               69
                 Neutrophils  3500             3812
                 Platlets     391653           370108
                 Lymphocytes  1839             2008", header = TRUE, row.names = 1)

这在列名中引入了Xs,我将在稍后处理。我rownames_to_column习惯将行名转换为一列,gather以日期为标题的列从宽格式变为长格式,然后修复日期格式。

df %>% 
  rownames_to_column() %>% 
  gather(var, value, -rowname) %>% 
  mutate(var = gsub("X", "", var),
         var = gsub("\\.", "-", var))

#        rowname        var  value
# 1      calcium 2017-01-01     80
# 2      glucose 2017-01-01     67
# 3  Neutrophils 2017-01-01   3500
# 4     Platlets 2017-01-01 391653
# 5  Lymphocytes 2017-01-01   1839
# 6      calcium 2017-01-15     91
# 7      glucose 2017-01-15     69
# 8  Neutrophils 2017-01-15   3812
# 9     Platlets 2017-01-15 370108
# 10 Lymphocytes 2017-01-15   2008

推荐阅读