【问题标题】:Melt a matrix using extern covariate in R在 R 中使用外部协变量熔化矩阵
【发布时间】:2018-02-19 16:49:07
【问题描述】:

我有一个矩阵:

mat1 <- matrix(rnorm(8), ncol = 4;
  ,dimnames=list(c('R1','R2'),c('C1','C2','C3','C4')))

> mat1
          C1         C2         C3        C4
R1  1.226139 -1.0604743 -0.1803689 0.3852505
R2 -1.232622 -0.5567295 -0.4146919 0.2433812

和一个匹配矩阵列名称的协变量

> covariate   <- factor(c('A','A','B','B'))
> t(data.frame(covariate, colnames(mat1)))
               [,1] [,2] [,3] [,4]
covariate      "A"  "A"  "B"  "B" 
colnames.mat1. "C1" "C2" "C3" "C4"

我想将它与协变量融合,以获得以下结果:

融合数据给出:

> melt( mat1 )
      Var1 Var2      value
    1   R1   C1  1.2261395
    2   R2   C1 -1.2326215
    3   R1   C2 -1.0604743
    4   R2   C2 -0.5567295
    5   R1   C3 -0.1803689
    6   R2   C3 -0.4146919
    7   R1   C4  0.3852505
    8   R2   C4  0.2433812

但是我想得到以下结果:

covariate_2 <- factor( c(rep('A',4) , rep('B',4) ))
> data.frame( covariate_2 , melted_data )
  covariate_2 Var1 Var2      value
1           A   R1   C1  1.2261395
2           A   R2   C1 -1.2326215
3           A   R1   C2 -1.0604743
4           A   R2   C2 -0.5567295
5           B   R1   C3 -0.1803689
6           B   R2   C3 -0.4146919
7           B   R1   C4  0.3852505
8           B   R2   C4  0.2433812

我认为必须有一种方法可以使用标准的 melt 函数获得结果。我将不胜感激。

【问题讨论】:

  • 如果共享使用生成随机数的函数创建的样本数据,请使用 set.seed
  • 您可以在使用ifelse 融合数据后添加covariate_2 - 列,因为它仅取决于Var2 的值。

标签: r reshape reshape2 melt


【解决方案1】:

也许最简单的方法是先重命名矩阵的列,然后再重命名melt

这里有几个例子,第一个使用“data.table”,第二个使用“tidyverse”:

library(data.table)
setDT(melt(`colnames<-`(mat1, paste(c('A','A','B','B'), colnames(mat1), sep = "_"))))[
  , c("cov", "V1") := tstrsplit(Var2, "_")][, Var2 := NULL][]
#    Var1      value cov V1
# 1:   R1  1.2261390   A C1
# 2:   R2 -1.2326220   A C1
# 3:   R1 -1.0604743   A C2
# 4:   R2 -0.5567295   A C2
# 5:   R1 -0.1803689   B C3
# 6:   R2 -0.4146919   B C3
# 7:   R1  0.3852505   B C4
# 8:   R2  0.2433812   B C4


library(tidyverse)
`colnames<-`(mat1, paste(c('A','A','B','B'), colnames(mat1), sep = "_")) %>% 
  as.data.frame() %>%
  rownames_to_column() %>%
  gather(var, val, -rowname) %>%
  separate(var, into = c("cov", "var1"))
#   rowname cov var1        val
# 1      R1   A   C1  1.2261390
# 2      R2   A   C1 -1.2326220
# 3      R1   A   C2 -1.0604743
# 4      R2   A   C2 -0.5567295
# 5      R1   B   C3 -0.1803689
# 6      R2   B   C3 -0.4146919
# 7      R1   B   C4  0.3852505
# 8      R2   B   C4  0.2433812

样本数据:

mat1 <- structure(c(1.226139, -1.232622, -1.0604743, -0.5567295, -0.1803689, 
    -0.4146919, 0.3852505, 0.2433812), .Dim = c(2L, 4L), .Dimnames = list(
        c("R1", "R2"), c("C1", "C2", "C3", "C4")))

【讨论】:

  • 感谢您的回答。
  • 嗨,确定它有效,正如你所展示的,有很多方法可以得到结果。但是我对内置函数很感兴趣。也许这样的功能不存在。我也对
    colnames&lt;- 语法很感兴趣。我已经用 '+(1,1)' 对其进行了测试,它确实有效!我第一次看到它。我如何接受你的回答?
  • @marc,您将在基本 R 中获得的最接近的是 stack。我现在正在通过手机发表评论,但我会在几个小时后回到电脑前发布一个示例。
猜你喜欢
  • 2012-01-03
  • 2014-02-22
  • 2017-12-26
  • 2021-09-12
  • 1970-01-01
  • 2023-02-08
  • 2022-01-04
  • 2018-05-03
  • 2016-04-10
相关资源
最近更新 更多