2013-06-04 5 views
1

Я знаю, что это может быть своеобразный вопрос, но:заказа строк в кадре данных

У меня есть кадр данных, который выглядит более или менее, как это:

t1 t2 t3 t4 
o1 NA 1 1 1 
o2 1 NA NA NA 
o3 NA NA 1 1 
o4 1 1 NA NA 
o5 1 1 1 1 

Я хочу, чтобы изменить порядок его так выглядит следующим образом:

t1 t2 t3 t4 
o3 NA NA 1 1 
o1 NA 1 1 1 
o5 1 1 1 1 
o4 1 1 NA NA 
o2 1 NA NA NA 

так как вы можете себе, если мы переходим от нижнего левого угла к верхнему правому углу есть этот «туннель» (путь, что угодно). Нижняя строка содержит большинство NA с правой стороны, средние строки не имеют ни одного, а верхние строки - это те, у которых NA (слева), верхний - самый NA.

Есть ли какой-либо простой (или, по крайней мере, не слишком жесткий) способ сделать это? Также фрейм данных относительно большой (400x3300). Имена столбцов и строк должны быть сохранены. Затем я хочу взять этот фрейм данных и сделать карту тепла.

+0

ли Меняйте не-NA значения? Когда вы говорите, что хотите сохранить имена строк, как ваш пример это делает? – mnel

+0

Да значения nonNA могут различаться. Я имею в виду, я хочу, чтобы результирующие data.frame/matrix/whatever имели каждую соответствующую метку. Как вы можете видеть в примере, порядок строк изменился, но все же каждая строка использует оригинальную метку - так что в основном метки перемещаются по строкам. –

ответ

2

Предполагая, что нет строки с NA с только в середине:

DF <- read.table(text=" t1 t2 t3 t4 
o1 NA 1 1 1 
o2 1 NA NA NA 
o3 NA NA 1 1 
o4 1 1 NA NA 
o5 1 1 1 1", header=TRUE) 

DF1 <- DF[is.na(DF$t1),] 
DF2 <- DF[rowSums(is.na(DF))==0,] 
DF3 <- DF[is.na(DF$t4),] 

DF1 <- DF1[order(-rowSums(is.na(DF1))),] 
DF3 <- DF3[order(rowSums(is.na(DF3))),] 

DF <- rbind(DF1,DF2,DF3) 

# t1 t2 t3 t4 
# o3 NA NA 1 1 
# o1 NA 1 1 1 
# o5 1 1 1 1 
# o4 1 1 NA NA 
# o2 1 NA NA NA 
+0

Удивительно, я думал о том, чтобы делать что-то подобное, но мне не хватало деталей (выбирая строки с NA и упорядочивая rowSums), спасибо! :-) –

2
d <- data.frame(t1=c(NA, 1, NA, 1, 1), 
       t2=c(1, NA, NA, 1, 1), 
       t3=c(1, NA, 1, NA,1), 
       t4=c(1, NA, 1, NA,1)) 
row.names(d) <- c("o1", "o2", "o3", "o4", "o5") 
d 
    t1 t2 t3 t4 
o1 NA 1 1 1 
o2 1 NA NA NA 
o3 NA NA 1 1 
o4 1 1 NA NA 
o5 1 1 1 1 


first1 <- apply(d, 1, function(x) {which(x == 1)[1] }) 
last1 <- apply(d, 1, function(x) {rev(which(x == 1))[1] }) 

d[order(first1, last1, decreasing=TRUE),] 

    t1 t2 t3 t4 
o3 NA NA 1 1 
o1 NA 1 1 1 
o5 1 1 1 1 
o4 1 1 NA NA 
o2 1 NA NA NA