2016-08-09 4 views
-2

У меня есть кадр данных 10x100 с именем CoeNIST. Строки имеют порядок значимости (то есть значение в строке 1 более важно, чем значение в строке 2), и каждый столбец представляет собой другой образец. Я хотел бы извлечь только самое значительное ненулевое значение, то есть первое ненулевое значение для каждого образца.Выбор первого ненулевого значения из каждого столбца в кадре данных

Вот образец из первых 9 столбцов CoeNIST.

> CoeNIST[,1:9] 
     1  2  3  4 5 6 7  8 9 
1  0 352232  0  0 0 0 0 28733 0 
2 332829  0  0 380109 0 0 0 380343 0 
3  0  0  0 380111 0 0 0 380409 0 
4  0  0  0 380101 0 0 0  0 0 
5  0  0 299211 380112 0 0 0  0 0 
6  0  0  0 380103 0 0 0  0 0 
7  0  0  0 380100 0 0 0 71899 0 
8  0  0  0 24812 0 0 0  0 0 
9  0  0  0  0 0 0 0 380410 0 
10  0 332958  0  0 0 0 0 380440 0 

И вот что я хотел бы результат, чтобы выглядеть

> NIST 
[1] 332829 352232 299211 380109 NA NA NA 28733 NA 

ИЛИ ... как список ...

> NIST 
[[1]] 
[1] 332829 

[[2]] 
[1] 352232 

[[3]] 
[1] 299211 

[[4]] 
[1] 380109 

[[5]] integer(0) 

[[6]] integer(0) 

[[7]] integer(0) 

[[8]] 
[1] 28733 

[[9]] integer(0) 
+1

«Строка в порядке signifigance и колонок каждый образец. Я хотел бы извлечь только наиболее signifigant значение для каждого образец." - Разве это не означает, что вы выбираете верхний ряд, если строки в порядке значимости? – Jon

+2

Непонятно, что вы подразумеваете под _most significant_. Не могли бы вы прояснить? – Abdou

+0

@ Johnnyboy, Если бы все верхние строки имели значения, если в столбце есть значение, которое я хотел бы извлечь. Поэтому, если в девятой строке есть значение и все нули над ней, я хотел бы взять значение из девятой строки. –

ответ

2
CoeNIST <- read.table(header=TRUE,text=" 
1  2  3  4 5 6 7  8 9 
1  0 352232  0  0 0 0 0 28733 0 
2 332829  0  0 380109 0 0 0 380343 0 
3  0  0  0 380111 0 0 0 380409 0 
4  0  0  0 380101 0 0 0  0 0 
5  0  0 299211 380112 0 0 0  0 0 
6  0  0  0 380103 0 0 0  0 0 
7  0  0  0 380100 0 0 0 71899 0 
8  0  0  0 24812 0 0 0  0 0 
9  0  0  0  0 0 0 0 380410 0 
10  0 332958  0  0 0 0 0 380440 0") 

Я бы описать вашу проблему, как «выбор первого ненулевого значения в каждом столбце.» Мое решение дает NA значению, когда Есть только нули в колонке ...

apply(CoeNIST,2,function(x) (x[x>0])[1]) 
##  X1  X2  X3  X4  X5  X6  X7  X8  X9 
## 332829 352232 299211 380109  NA  NA  NA 28733  NA 
+0

Спасибо. Извините за любую путаницу в том, как я задал вопрос. –

+2

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

+0

(поскольку вы редактируете свой вопрос, подумайте о том, чтобы восстановить его как «извлечение первого ненулевого элемента из каждого столбца кадра данных» ...) –

1
CoeNIST = matrix(c(0, 352232, 0, 0, 0, 0, 0, 28733, 0, 332829, 0, 0, 380109, 0, 0, 0, 380343, 0, 0, 0, 0, 380111, 0, 0, 0, 380409, 0, 0, 0, 0, 380101, 0, 0, 0, 0, 0, 0, 0, 299211, 380112, 0, 0, 0, 0, 0, 0, 0, 0, 380103, 0, 0, 0, 0, 0, 0, 0, 0, 380100, 0, 0, 0, 71899, 0, 0, 0, 0, 24812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380410, 0, 0, 332958, 0, 0, 0, 0, 0, 380440, 0), nrow=10, ncol=10, byrow=T) 

> CoeNIST 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,]  0 352232  0 0 0  0  0 28733  0 332829 
[2,]  0  0 380109 0 0  0 380343  0  0  0 
[3,]  0 380111  0 0 0 380409  0  0  0  0 
[4,] 380101  0  0 0 0  0  0  0 299211 380112 
[5,]  0  0  0 0 0  0  0  0 380103  0 
[6,]  0  0  0 0 0  0  0 380100  0  0 
[7,]  0 71899  0 0 0  0 24812  0  0  0 
[8,]  0  0  0 0 0  0  0  0  0 380410 
[9,]  0  0 332958 0 0  0  0  0 380440  0 
[10,]  0 352232  0 0 0  0  0 28733  0 332829 

Это для макс. каждого столбца:

apply(CoeNIST, 2, function(x){x_max = max(x); if(x_max == 0) NULL else x_max})}) 

Это первый ненулевое значение в столбце:

apply(CoeNIST, 2, function(x){x_top_non_zero = min(which(x>0)); if(x_top_non_zero == Inf) {NaN} else {x_top_non_zero}}) 
+0

Я не ищу максимальное числовое значение, i ' m ищет значение, которое существует в самой высокой строке. –

+0

@ ZachEisner, вы ищете первое ненулевое значение в каждой строке? – Jon

+0

Вы можете использовать форматирование кода? –

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