【问题标题】:Values change when melting numeric column headers using reshape package使用 reshape 包熔化数字列标题时值会发生变化
【发布时间】:2020-08-25 16:09:09
【问题描述】:

我有一个如下所示的数据框:

colnames<-c('Assay','Sample','Interference','0','24','48','168')
Assay<-c('1','2','3','4','5','6','7','8','9')
Sample<-c('S1.16S','B2','B5','B32','B36','B39','B47','B57','A15')
Interference<-c('N','Y','N','N','N','Y','N','Y','Y')
'0'<-c(14.337,24.21,14.97,15.51,14.64,28.83,13.63,21.08,20.26)
'24'<-c(NA,25.13,14.99,15.35,14.71,28.64,13.68,22.04,20.64)
'48'<-c(NA,25.32,15.00,15.97,14.64,28.69,13.87,NA,22.14)
'168'<-c(NA,24.7,15.09,17.31,14.67,NA,14.9,23.22,21.56)
d<-data.frame(Assay, Sample, Interference, 0,24,48,168, check.names=FALSE)

当使用reshape包将数据熔解为长格式时,0、24、48、168列的值变为1-4,如下所示:

library(reshape)
dlong<-melt(d, id.vars=c('Assay','Sample','Interference'), measure.vars=c('0','24','48','168'))
dlong$variable<-as.numeric(dlong$variable)
head(dlong)
#  Assay Sample Interference variable value
#1     1 S1.16S            N        1     0
#2     2     B2            Y        1     0
#3     3     B5            N        1     0
#4     4    B32            N        1     0
#5     5    B36            N        1     0
#6     6    B39            Y        1     0

如何在“变量”列中保留数字值(0,24,48,168),而无需使用其他代码稍后转换它们?我需要对整个数据集运行下游相关性分析,这会导致我的处理时间相当滞后。

【问题讨论】:

标签: r reshape melt


【解决方案1】:

我建议检查您的数据结构。您遇到的问题是由于因素结构。为避免此问题,请在您的 data.frame() 中添加 stringsAsFactors=F。下一个代码可能对您有用:

library(reshape2)
#Data
colnames<-c('Assay','Sample','Interference','0','24','48','168')
Assay<-c('1','2','3','4','5','6','7','8','9')
Sample<-c('S1.16S','B2','B5','B32','B36','B39','B47','B57','A15')
Interference<-c('N','Y','N','N','N','Y','N','Y','Y')
'0'<-c(14.337,24.21,14.97,15.51,14.64,28.83,13.63,21.08,20.26)
'24'<-c(NA,25.13,14.99,15.35,14.71,28.64,13.68,22.04,20.64)
'48'<-c(NA,25.32,15.00,15.97,14.64,28.69,13.87,NA,22.14)
'168'<-c(NA,24.7,15.09,17.31,14.67,NA,14.9,23.22,21.56)
d<-data.frame(Assay, Sample, Interference, 0,24,48,168, check.names=FALSE,stringsAsFactors = F)
#Reshape
dlong<-melt(d, id.vars=c('Assay','Sample','Interference'), measure.vars=c('0','24','48','168'))

输出:

   Assay Sample Interference variable value
1      1 S1.16S            N        0     0
2      2     B2            Y        0     0
3      3     B5            N        0     0
4      4    B32            N        0     0
5      5    B36            N        0     0
6      6    B39            Y        0     0
7      7    B47            N        0     0
8      8    B57            Y        0     0
9      9    A15            Y        0     0
10     1 S1.16S            N       24    24
11     2     B2            Y       24    24
12     3     B5            N       24    24
13     4    B32            N       24    24
14     5    B36            N       24    24
15     6    B39            Y       24    24
16     7    B47            N       24    24
17     8    B57            Y       24    24
18     9    A15            Y       24    24
19     1 S1.16S            N       48    48
20     2     B2            Y       48    48
21     3     B5            N       48    48
22     4    B32            N       48    48
23     5    B36            N       48    48
24     6    B39            Y       48    48
25     7    B47            N       48    48
26     8    B57            Y       48    48
27     9    A15            Y       48    48
28     1 S1.16S            N      168   168
29     2     B2            Y      168   168
30     3     B5            N      168   168
31     4    B32            N      168   168
32     5    B36            N      168   168
33     6    B39            Y      168   168
34     7    B47            N      168   168
35     8    B57            Y      168   168
36     9    A15            Y      168   168

【讨论】:

    【解决方案2】:

    如果我们使用R版本>= 4.0.0,默认选项是stringsAsFactors = FALSE,所以我们在data.frame构造中不用改

    library(dplyr)
    library(tidyr)
    d %>% 
        pivot_longer(cols = `0`:`168`)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2016-12-14
      相关资源
      最近更新 更多