2015-11-19 3 views
1

Я наткнулся на следующее. Я прочитал руководство по перестройке, но все еще потерял. Есть ли эффективный и элегантный способ изменить матрицу четных кусков? приведен код для генерации матрицы и переформатированной матрицы.R: изменить данные кусками - более элегантный способ

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

Спасибо!

+0

Просьба указать ссылки и подтверждение источников, которые вы используете. –

+1

похоже на ответ @ akrun 'sapply (1: 3, function (ii) x [, grep (paste0 (ii, '$'), colnames (x))])' – rawr

ответ

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)])} 
+0

странно! но для реального набора у меня есть следующая ошибка Ошибка в match.names (clabs, names (xi)): имена не соответствуют предыдущим именам –

+1

@JohnAmraph 'rbind' требует, чтобы имена столбцов были сопоставлены. Возможно, в исходном наборе данных у вас нет совпадающих имен. Один из способов - это 'colnames (x) <- NULL', а затем попробовать с кодом. – akrun

+1

@JohnAmraph В вашем примере тоже имена столбцов не совпадают, и они работают. У вас действительно есть «матрица» в качестве входных данных? – akrun

0
x[,c(matrix(1:9, 3, byrow=TRUE))] # or shorter: 
x[,matrix(1:9, 3, byrow=TRUE)] 
2

Если вы хотите использовать подход, основанный на имени, а не позиция на основе, то вы должны смотреть на 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).

+0

Или, возможно, : 'patts <- unique (sub (" (. *) _. * "," \\ 1 ", colnames (x)))' –