2016-03-19 2 views
2
Q1=c(0,1,0,1,0,1,0,1) 
Q2=c(1,0,0,0,1,1,1,0) 
Q3=c(0,0,0,0,0,0,0,0) 
Q4=c(1,0,0,0,1,1,1,0) 
Q = cbind(Q1,Q2, Q3, Q4) 
Q = matrix(Q, 8, 4) 

    [,1] [,2] [,3] [,4] 
[1,] 0 1 0 1 
[2,] 1 0 0 0 
[3,] 0 0 0 0 
[4,] 1 0 0 0 
[5,] 0 1 0 1 
[6,] 1 1 0 1 
[7,] 0 1 0 1 
[8,] 1 0 0 0 

Я хочу, чтобы написать функциюРаботают на каждых двух столбцов в матрице

ifelse(Q[1]==1||Q[2]==1, 1,0) 

, а затем продолжают расти в колонке 3 и 4

ifelse(Q[3]==1||Q[4]==1, 1,0) 

Возвращение матрицы

Эта мой код:

n = function(n){ 
x <- matrix(n row= 8,n col=n) 
for(i in 1:n){ 
    for (j in 1: 4){ 
i = 1 
j = 1 
x[,i]= apply(Q, 1, function(x)if else(x[j]==1||x[j+1]==1, 1,0)) 
j = j+2 
} 
return(x) 
} 
} 
n(1) 
n(2) 

    [,1] [,2] 
[1,] 1 NA 
[2,] 1 NA 
[3,] 0 NA 
[4,] 1 NA 
[5,] 1 NA 
[6,] 1 NA 
[7,] 1 NA 

Я думаю, что я сделал что-то неправильно, то новая матрица предположим, плюс у меня есть более чем 100 столбцов, так что я должен написать увеличить петлю каждые 2 колонки

 [,1] [,2] 
[1,] 1 1 
[2,] 1 0 
[3,] 0 0 
[4,] 1 0 
[5,] 1 1 
[6,] 1 1 
[7,] 1 1 
+0

Я думаю, что последнее значение во втором столбце должно быть нулевым, нет? –

+0

есть, опечатка. спасибо – BIN

+0

Возможно, [это] (http://stackoverflow.com/questions/10661295/apply-a-function-over-groups-of-columns) поможет вам. – Sotos

ответ

0
Thanks guys,now this time I got right. We can group by how many variables you want. I have 2 ways to do that, the first one is not good, the second one is better 

> Q1=c(0,1,0,1,0,1,0,1) 
> Q2=c(1,0,0,0,1,1,1,0) 
> Q3=c(0,0,0,0,0,0,0,0) 
> Q4=c(1,0,0,0,1,1,1,0) 
> Q5=c(1,0,0,0,1,1,1,0) 
> Q6=c(0,0,0,0,0,0,0,0) 
> Q7=c(1,0,0,0,1,1,1,0) 
> Q8=c(0,0,0,0,0,0,0,0) 
> Q9=c(1,0,0,0,1,1,1,0) 
> Q = cbind(Q1,Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9) 
> Q = matrix(Q, 8, 9) 
> Q 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 1 0 1 1 0 1 0 1 
[2,] 1 0 0 0 0 0 0 0 0 
[3,] 0 0 0 0 0 0 0 0 0 
[4,] 1 0 0 0 0 0 0 0 0 
[5,] 0 1 0 1 1 0 1 0 1 
[6,] 1 1 0 1 1 0 1 0 1 
[7,] 0 1 0 1 1 0 1 0 1 
[8,] 1 0 0 0 0 0 0 0 0 
> 

> This is the first way 

> x <- list(1:3,4:6,7:9) 
> do.call(cbind, lapply(x, function(i) ifelse(rowSums(Q[,i]>=1), 1,0))) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 0 0 
[3,] 0 0 0 
[4,] 1 0 0 
[5,] 1 1 1 
[6,] 1 1 1 
[7,] 1 1 1 
[8,] 1 0 0 
> 
>This is the second way, it's better 
> 
> Q.t <- data.frame(t(Q)) 
> n <- 3 
> Q.t$groups <- rep(seq(1:(ncol(Q)/n)), each = n, len = (ncol(Q))) 
> QT <- data.table(Q.t) 
> setkey(QT, groups) 
> Q.level <- QT[,lapply(.SD,sum), by = groups] 
> Q.level <- t(Q.level) 
> Q.level <- Q.level[-1,] 
> apply(Q.level,2, function(x) ifelse(x>=1,1,0)) 
    [,1] [,2] [,3] 
X1 1 1 1 
X2 1 0 0 
X3 0 0 0 
X4 1 0 0 
X5 1 1 1 
X6 1 1 1 
X7 1 1 1 
X8 1 0 0 
> 
+0

Первый способ кажется намного лучше. Вы можете улучшить производительность, выполнив '(sapply (x, function (i) rowSums (Q [, i]))> 0) + 0', например. Или 'ifelse (sapply (x, function (i) rowSums (Q [, i]))> 0, 1, 0)' –

+0

Я расскажу об этом – BIN

Смежные вопросы