2013-11-10 5 views
1

Я пытаюсь выполнить следующую задачу, чтобы получить к матричным d:Объединить выбранные столбцы из множества матриц

d1<-matrix(as.factor(rep(sample(1:10,10,T),5)),ncol=5) 
d2<-matrix(as.factor(rep(sample(1:10,10,T),5)),ncol=5) 
d3<-matrix(as.factor(rep(sample(1:10,10,T),5)),ncol=5) 

d<-cbind(
    cbind(d1[,2],d1[,5]), 
    cbind(d2[,2],d2[,5]), 
    cbind(d3[,2],d3[,5]) 
) 

Но для многих матриц d1 ... дп, скажем.

В общем, я хотел бы выбрать одни и те же номера столбцов из серии матриц и добавить в одну матрицу. Основное внимание в этой задаче уделяется объединению, а не созданию матриц. Колонки вектора факторного типа должны быть сохранены.

Я думал о чем-то вдоль линий

d<-matrix(nrow=10) 
dl<-list(d1,d2,d3) 
for (i in 1:3){ 
    d<-cbind(d,dl[[i]][,2],dl[[i]][,5]) 
} 

Но, может быть, есть лучший способ.

ответ

3

Вы можете создать list ваших матриц и использовать do.call и lapply, чтобы получить то, что вы хотите:

matList <- list(d1, d2, d3) 
do.call(cbind, lapply(matList, function(x) x[, c(2, 5)])) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "3" "3" "3" "3" "10" "10" 
# [2,] "4" "4" "2" "2" "3" "3" 
# [3,] "6" "6" "7" "7" "7" "7" 
# [4,] "10" "10" "4" "4" "2" "2" 
# [5,] "3" "3" "8" "8" "3" "3" 
# [6,] "9" "9" "5" "5" "4" "4" 
# [7,] "10" "10" "8" "8" "1" "1" 
# [8,] "7" "7" "10" "10" "4" "4" 
# [9,] "7" "7" "4" "4" "9" "9" 
# [10,] "1" "1" "8" "8" "4" "4" 

Кстати, тип данных в вашей матрице character, не factor. Смотрите страницу справки в ?matrix, где вы найдете следующее:

Способ кадров данных возвращает матрицу символов, если есть только атомные столбцы и какого-либо не столбец (числовой/логический/комплекс), применяя в качестве .vector к факторам и формат для других несимвольных столбцов.

+0

Отлично, спасибо. Я еще не знаком с операциями do.call. Что-то узнать здесь. – tomka