【问题标题】:R: reshape data by chunks - more elegant wayR:按块重塑数据 - 更优雅的方式
【发布时间】:2015-11-19 15:44:40
【问题描述】:

我偶然发现了以下事情。我阅读了重塑手册,但仍然迷失了方向。 有没有一种更高效、更优雅的方式来重塑偶数块的矩阵? 生成矩阵和重构矩阵的代码如下。

# current matrix
x <- matrix(sample(20*9), 20, 9)
colnames(x) <- c(paste("time",c(1:3),sep="_"),
paste("SGNL", 1, c(1:3), sep="_"),
paste("SGNL", 2, c(1:3), sep="_"))
# reshaped matrix
x.reshaped <- rbind( x[,c(1,4,7)], x[,c(2,5,8)], x[,c(3,6,9)] )
colnames(x.reshaped) <- sub("\\_1$", "", colnames(x.reshaped))

谢谢!

【问题讨论】:

  • 请提供您使用的来源的链接并确认。
  • 类似于@akrun 的回答sapply(1:3, function(ii) x[, grep(paste0(ii, '$'), colnames(x))])

标签: r reshape reshape2


【解决方案1】:

如果您想使用基于名称而不是基于位置的方法,那么您应该查看“data.table”中的melt

library(data.table)
melt(as.data.table(x), measure.vars = patterns("time", "SGNL_1", "SGNL_2"))

示例输出:

head(melt(as.data.table(x), measure.vars = patterns("time", "SGNL_1", "SGNL_2")))
#    variable value1 value2 value3
# 1:        1     48    110    155
# 2:        1     67     35    140
# 3:        1    102     55     72
# 4:        1    161     39     66
# 5:        1     36    137     99
# 6:        1    158    169     85

或者,在基础 R 中:

patts <- c("time", "SGNL_1", "SGNL_2")
sapply(patts, function(y) c(x[, grep(y, colnames(x))]))
#       time SGNL_1 SGNL_2
#  [1,]   48    110    155
#  [2,]   67     35    140
#  [3,]  102     55     72
#  [4,]  161     39     66
#  [5,]   36    137     99
# .
# .
# .
# .
# [56,]   13      1     84
# [57,]   40     46     95
# [58,]  152      7    178
# [59,]   81     79    123
# [60,]   50    101    146

使用set.seed(1) 生成的数据。

【讨论】:

  • 或者:patts &lt;- unique(sub("(.*)_.*", "\\1", colnames(x)))
【解决方案2】:

我们可以在list 中创建矩阵子集(基于seq 生成的索引),然后将其放在一起rbind

do.call(rbind, lapply(1:3, function(i) x[,seq(i, length.out=3, by=3)]))

或使用for 循环

 m2 <- c()
 for(i in 1:3) { m2 <- rbind(m2, x[,seq(i, length.out=3, by=3)])}

【讨论】:

  • 奇怪!但对于真正的集合,我在 match.names(clabs, names(xi)) 中有以下错误错误:名称与以前的名称不匹配
  • @JohnAmraph rbind 要求匹配列名。也许在原始数据集中您没有匹配的名称。一种方法是colnames(x) &lt;- NULL,然后尝试使用代码。
  • @JohnAmraph 在您的示例中,列名也不匹配并且它正在工作。你真的有matrix 作为输入吗?
  • @JohnAmraph 我问是否是matrix 的原因是x &lt;- as.data.frame(x) 然后运行代码。我犯了同样的错误。我想说将data.frame(如果是您的原始数据)转换为matrixx1 &lt;- as.matrix(x),然后运行代码。
  • 是的,矩阵是个问题
【解决方案3】:
x[,c(matrix(1:9, 3, byrow=TRUE))] # or shorter:
x[,matrix(1:9, 3, byrow=TRUE)]

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多