簡體   English   中英

R:用塊重塑數據 - 更優雅的方式

[英]R: reshape data by chunks - more elegant way

我偶然發現了以下事情。 我閱讀了重塑手冊,但仍然丟失了。 是否有一種有效且更優雅的方式來重塑偶數塊的矩陣? 生成矩陣和重新整形矩陣的代碼如下。

# 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))

謝謝!

如果你想使用的方法是基於位置的名稱為基礎的,而不是,那么你應該看看melt從“data.table”:

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)生成的數據。

我們可以創建矩陣(基於生成的索引的子seq )的list ,然后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)])}
x[,c(matrix(1:9, 3, byrow=TRUE))] # or shorter:
x[,matrix(1:9, 3, byrow=TRUE)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM