Свернуть матрицу в вектор и заменить значения именами столбцов - PullRequest
0 голосов
/ 13 декабря 2018

Существует такая матрица:

m <- matrix(c(F,T,F,T,F,T,F,T,F, F,F,T,F,T,F,T,F,T), nrow=9, ncol=2,
           dimnames=list(c(), c('1x2x24','2x2x24')))

    1x2x24 2x2x24
[1,]  FALSE  FALSE
[2,]   TRUE  FALSE
[3,]  FALSE   TRUE
[4,]   TRUE  FALSE
[5,]  FALSE   TRUE
[6,]   TRUE  FALSE
[7,]  FALSE   TRUE
[8,]   TRUE  FALSE
[9,]  FALSE   TRUE

Предположительно, существует только одна ИСТИНА на строку.Каков наилучший способ получить вектор, подобный этому:

NA, 1x2x24, 2x2x24, 1x2x24, 2x2x24, 1x2x24, 2x2x24, 1x2x24, 2x2x24

Один из способов получить его - заменить каждое ИСТИНА в каждом столбце именем столбца, а каждый ЛОЖЬ - NA или "".Затем объедините все столбцы в строках с помощью paste ().Я не совсем уверен, как это сделать.Любая помощь высоко ценится.

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Мы можем использовать

apply(m,1,function(x) names(which(x))[1])
# [1,]     [2,]     [3,]     [4,]     [5,]     [6,]     [7,]     [8,]     [9,]  
#   NA "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24" "2x2x24" 
0 голосов
/ 13 декабря 2018

Я использовал функцию coalesce из пакета dplyr после того, как все значения FALSE были преобразованы в NA с функцией ifelse.Это не самый чистый способ сделать это, но это работает.Для полноты: если dplyr еще не установлен, сначала вам нужно будет запустить install.packages("dplyr").

library(dplyr)

X <- matrix(c(F,T,F,T,F,T,F,T,F, F,F,T,F,T,F,T,F,T), nrow=9, ncol=2,
            dimnames=list(c(), c('1x2x24','2x2x24')))
> X
      1x2x24 2x2x24
 [1,]  FALSE  FALSE
 [2,]   TRUE  FALSE
 [3,]  FALSE   TRUE
 [4,]   TRUE  FALSE
 [5,]  FALSE   TRUE
 [6,]   TRUE  FALSE
 [7,]  FALSE   TRUE
 [8,]   TRUE  FALSE
 [9,]  FALSE   TRUE

# Here we can use ifelse to turn F into NA
#> ifelse(X[,1]==F, NA_integer_, colnames(X)[1])
#[1] NA       "1x2x24" NA       "1x2x24" NA       "1x2x24" NA       "1x2x24" NA      

#> ifelse(X[,2]==F, NA_integer_, colnames(X)[2])
#[1] NA       NA       "2x2x24" NA       "2x2x24" NA       "2x2x24" NA       "2x2x24"


y<-as.character(data.frame(ifelse(X[,1]==F, NA_integer_, colnames(X)[1]))[,1])
z<-as.character(data.frame(ifelse(X[,2]==F, NA_integer_, colnames(X)[2]))[,1])

coalesce(y,z)
[1] NA       "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24" "2x2x24"
0 голосов
/ 13 декабря 2018

Это должно работать

C1<-c(FALSE,FALSE,FALSE,FALSE,
   TRUE,FALSE,FALSE,TRUE, 
   TRUE,FALSE,FALSE,TRUE,
   TRUE,FALSE,FALSE,TRUE, 
   TRUE,FALSE,FALSE,TRUE)
print(C1)
m<-matrix(C1,ncol=2)
colnames(m)<-c("1x2x24","2x2x24")
vector_result<-(apply(m, 1, 
function(u) paste(names(which(u)), collapse="NA" ) 
))
idx<-(which(vector_result=="")) # replace "" with NA     
vector_result[idx]="NA"
print(vector_result)
0 голосов
/ 13 декабря 2018

Используя входную матрицу m, определенно воспроизводимую в примечании в конце, если мы умножим ее на матрицу 1: 2, что равносильно умножению каждой строки на 1: 2, что дает вектор такой же длины, что и числострок, так что каждый элемент равен 0, если в этой строке нет значений ИСТИНА, 1, если в первом столбце этой строки есть значение ИСТИНА, и 2, если во втором столбце этой строки есть значение ИСТИНА.Добавьте к этому 1 и индекс в 3-кортеж, первый элемент которого - NA, а последующие элементы - имена столбцов.

c(NA, colnames(m))[m %*% 1:2 + 1]
## [1] NA       "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24" "2x2x24" "1x2x24"
## [9] "2x2x24"

В качестве альтернативы мы можем использовать те же вычисления, но использовать их для определения коэффициента, который мы конвертируемв строку символов:

as.character(factor(m %*% 1:2 + 1, lab = c(NA, colnames(m))))

Если окажется, что в строке можно иметь два ИСТИННЫХ значения, то для таких строк вычисление дает 4, поэтому просто замените c(NA, colnames(m)) на c(NA, colnames(m), "both"), скажем,.

Примечание

m <- structure(c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, 
FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE
), .Dim = c(9L, 2L), .Dimnames = list(c("[1,]", "[2,]", "[3,]", 
"[4,]", "[5,]", "[6,]", "[7,]", "[8,]", "[9,]"), c("1x2x24", 
"2x2x24")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...