熔化输出意外,所有0值

时间:2018-10-25 14:43:51

标签: r reshape2

以下是只有一行的以下数据框。在大多数情况下,数据帧包含很多行,但是遇到一种特殊情况,即我只有一行。

library(reshape2)
  temp <- structure(list(D0 = 0, D2 = 0, D14 = 0, D14 = 0, D14 = 8.1210458037618, 
D14 = 16.4531432694911, D7 = 0, D0 = 0, D0 = 0, D14 = 0, 
D0 = 0, D14 = 0, D7 = 12.9742361276578, D0 = 9.38010319990484, 
D14 = 6.35545262547878, D2 = 0, D14 = 1.35569798573994, D7 = 13.340409178823, 
D2 = 9.36805417941219, D2 = 15.432692223528, D14 = 0, D0 = 0, 
D14 = 0, D7 = 6.09471835659014, D7 = 0, D2 = 0, D2 = 7.67135586471563, 
D14 = 28.1073822991286, D14 = 0, D2 = 7.58819062711938, D7 = 0, 
D0 = 1.5735281713825, D0 = 0, D7 = 1.86165503278318, D7 = 5.35571350639711, 
D2 = 2.47400939410094, D14 = 21.3059220365934, D0 = 0, D7 = 8.69569412672166, 
D0 = 0, D14 = 0, D2 = 0.531180424946459, D0 = 3.42867314180642, 
D0 = 0, D2 = 0, D14 = 0, D7 = 0.775767964360802, D0 = 2.59382750787083, 
D7 = 0.600664752805997, D2 = 7.35512462974749, D14 = 2.30110773119572, 
D7 = 3.23850639812659, D0 = 0, D7 = 0.958981742285896, D2 = 3.84623208865623, 
D2 = 2.70323099283864, D7 = 1.65260222673919, D0 = 0, D2 = 4.00782923944589, 
D7 = 5.65802187007992, D0 = 0, D0 = 0, D7 = 0, phylum = structure(1L, .Label = "Acidobacteria", class = "factor")), row.names = 14L, class = "data.frame")

    > temp
       D0 D2 D14 D14      D14      D14 D7 D0 D0 D14 D0 D14       D7       D0      D14 D2      D14       D7       D2
    14  0  0   0   0 8.121046 16.45314  0  0  0   0  0   0 12.97424 9.380103 6.355453  0 1.355698 13.34041 9.368054
             D2 D14 D0 D14       D7 D7 D2       D2      D14 D14       D2 D7       D0 D0       D7       D7       D2
    14 15.43269   0  0   0 6.094718  0  0 7.671356 28.10738   0 7.588191  0 1.573528  0 1.861655 5.355714 2.474009
            D14 D0       D7 D0 D14        D2       D0 D0 D2 D14       D7       D0        D7       D2      D14       D7 D0
    14 21.30592  0 8.695694  0   0 0.5311804 3.428673  0  0   0 0.775768 2.593828 0.6006648 7.355125 2.301108 3.238506  0
              D7       D2       D2       D7 D0       D2       D7 D0 D0 D7        phylum
    14 0.9589817 3.846232 2.703231 1.652602  0 4.007829 5.658022  0  0  0 Acidobacteria

我正在运行一个melt函数来按门类汇总数据,如下所示(接下来将使用ggplot绘制数据)

> reshape2::melt(temp,id="phylum")
         phylum variable value
1 Acidobacteria       D0     0
2 Acidobacteria       D2     0
3 Acidobacteria      D14     0
4 Acidobacteria       D7     0

为什么我只能得到0个值???我希望酸性细菌的所有D0和酸性细菌的所有D2的总和,依此类推

> sum(temp[,colnames(temp) =="D0"]) 
[1] 16.97613

1 Acidobacteria       D0     16.97613
2 Acidobacteria       D2     60.9779
3 Acidobacteria      D14     83.99975
4 Acidobacteria       D7     83.99975

1 个答案:

答案 0 :(得分:0)

您要查找的输出需要一个三个阶段的过程:1)重命名变量,2)融合数据,3)汇总数据。我们使用dplyrtidyr软件包(或reshape2,如果您热衷于该软件包)来完成此操作。

library(dplyr)
library(tidyr)

temp <- structure(list(D0 = 0, D2 = 0, D14 = 0, D14 = 0, D14 = 8.1210458037618, 
                       D14 = 16.4531432694911, D7 = 0, D0 = 0, D0 = 0, D14 = 0, 
                       D0 = 0, D14 = 0, D7 = 12.9742361276578, D0 = 9.38010319990484, 
                       D14 = 6.35545262547878, D2 = 0, D14 = 1.35569798573994, D7 = 13.340409178823, 
                       D2 = 9.36805417941219, D2 = 15.432692223528, D14 = 0, D0 = 0, 
                       D14 = 0, D7 = 6.09471835659014, D7 = 0, D2 = 0, D2 = 7.67135586471563, 
                       D14 = 28.1073822991286, D14 = 0, D2 = 7.58819062711938, D7 = 0, 
                       D0 = 1.5735281713825, D0 = 0, D7 = 1.86165503278318, D7 = 5.35571350639711, 
                       D2 = 2.47400939410094, D14 = 21.3059220365934, D0 = 0, D7 = 8.69569412672166, 
                       D0 = 0, D14 = 0, D2 = 0.531180424946459, D0 = 3.42867314180642, 
                       D0 = 0, D2 = 0, D14 = 0, D7 = 0.775767964360802, D0 = 2.59382750787083, 
                       D7 = 0.600664752805997, D2 = 7.35512462974749, D14 = 2.30110773119572, 
                       D7 = 3.23850639812659, D0 = 0, D7 = 0.958981742285896, D2 = 3.84623208865623, 
                       D2 = 2.70323099283864, D7 = 1.65260222673919, D0 = 0, D2 = 4.00782923944589, 
                       D7 = 5.65802187007992, D0 = 0, D0 = 0, D7 = 0, phylum = structure(1L, .Label = "Acidobacteria", class = "factor")), row.names = 14L, class = "data.frame")

# Append a suffix to the column names to make them unique
names(temp) = paste0(names(temp), '_', 1:ncol(temp))
# Melt the data
temp = gather(temp, key='variable', value='value', -phylum_64)
# Could alternatively use melt(temp, id='phylum_64')
# Remove the suffixes from the column names
temp$variable = gsub('_\\d+', '', temp$variable)
# Group by the prior column names and sum the values
temp = temp %>%
    group_by(variable) %>%
    summarise(value = sum(value))

  variable    value
1       D0 16.97613
2      D14 83.99975
3       D2 60.97790
4       D7 61.20697