2016-04-28 4 views
0

Скажем, это моя матрица «marx» с nrow = 400 ncol = 250. Я хочу, чтобы выбрать только половину данных (топ 50%) из каждой колонки (за исключением NA)Выберите 50% данных в каждом столбце

  V272  V273  V274  V275  V276  V277 
[1,] 0.2337847 0.2612946 0.41232797  NA 0.11931570 0.2543780 
[2,] 0.3277191 0.3590431 0.06490879 0.2690663   NA 0.1632647 
[3,]  NA 0.1536955 0.03604548 0.1361645   NA 0.2252554 
[4,] 0.3483152 0.5342417 0.07404933  NA 0.14699876 0.2082977 
[5,] 0.4213399 0.2511010 0.30502173 0.1189562 0.08962128 0.2919712 
[6,] 0.1604953 0.2101048   NA  NA 0.01270747 0.2322928 

Я попытался с образцом = длина (х)/2 и петли, но до сих пор, что не делает Работа. У кого-то есть мысли?

+0

Вы хотите выборочно выбирать из каждой колонки независимо и произвольно? Или просто есть первая половина вашей матрицы? Или Сортировка данных из каждого столбца и выбор всего выше медианы? И какой класс вашей структуры данных? Вы говорите «матрицу», которую вы называете «df», что подразумевает «data.frame» ... – Gregor

+0

Если вы хотите сохранить данные целыми (рядными словами), один из вариантов - «complete.cases()», а затем сколько оставшихся строк. 'df <- df [complete.cases (df),]; df <- df [sample (1: nrow (df), n),] 'где n - количество требуемых строк. – Gopala

+0

Я хочу сортировать данные в порядке убывания. Затем выберите половину этих чисел (исключая NA) из каждого столбца. Извините, мои данные в матричной форме. – beboo23

ответ

0

Посмотрите на использование функции head().

b <- data.frame(1:4, 2:8) 
head(b, n = nrow(b/2)) 

Это не приведет к удалению вашего NA-х, хотя, так что вы можете сделать

head(b[!is.na(b[,1]),1], n = nrow(b)/2) 

И итерацию или использовать функцию применения. Измените 1 в b [, 1]), 1], чтобы быть вашими столбцами. У вас будет оборванный массив, так как ваши NA перемежаются в каждом столбце.

EDIT: Видя ваш комментарий, вы должны использовать порядок, то есть:

apply(b, 2, function(x) head(x[order(x, decreasing = TRUE)], n = length(x)/2)) 
+0

Применение вашей формулы, у меня есть это сообщение об ошибке Ошибка: length (n) == 1L не TRUE – beboo23

+0

Замените nrow длиной и не забудьте включить эту запятую, которую я пропустил: apply (b 2, function (x) head (x [порядок (x, убывающий = TRUE)], n = длина (x)/2)) Извините, двойное обновление, вам нужно также подмножить матрицу, используя заказ, перед вызовом главы. – Heymans

2

Я хотел бы сделать это следующим образом:

apply(x, 2, FUN = function(x) sort(x, decreasing = T)[1:floor(length(x)/2)]) 

Демонстрация:

set.seed(47) 
x = matrix(rnorm(100), 10) 
x[1, 3] = NA 
x 
#    [,1]  [,2]  [,3]   [,4]  [,5]  [,6]  [,7]  [,8] 
# [1,] 1.99469634 -0.92245624   NA 0.4836041107 0.06116275 0.9697466 0.03838225 1.2174872 
# [2,] 0.71114251 0.03960243 0.24914817 0.1443376363 -0.10856462 1.6756248 0.06893424 0.7314502 
# [3,] 0.18540528 0.49382018 -0.34041599 -1.2004406274 -0.15469524 1.9882438 1.74017016 1.1339939 
# [4,] -0.28176501 -1.82822917 0.41719084 0.8852306473 0.95048417 -0.9870583 1.30627664 2.1879180 
# [5,] 0.10877555 0.09147291 -0.32646679 0.8869350447 -0.48769640 -1.8300307 -0.14493417 0.2212036 
# [6,] -1.08573747 0.67077922 -0.89029402 0.0006863592 -0.92024188 1.0081416 1.56234731 -0.9390224 
# [7,] -0.98548216 -0.08107805 -1.60815993 -0.6932373819 0.89797526 -0.8691044 1.24215371 0.8384429 
# [8,] 0.01513086 1.26424109 -2.32237229 0.2608364805 -0.35629514 -0.5151981 1.46129302 0.5291967 
# [9,] -0.25204590 -0.70338819 -1.96721918 0.5066869590 1.03190009 -0.5002165 -0.98583638 -1.0883085 
# [10,] -1.46575030 -0.04057817 0.02752681 0.5643018376 0.66430042 -0.2725779 0.92561447 -0.7955874 
#    [,9]  [,10] 
# [1,] 0.96832400 1.136878023 
# [2,] 0.18510415 0.004507257 
# [3,] -0.41257000 1.341705472 
# [4,] -0.83292772 -1.365424404 
# [5,] 0.95488318 0.926037646 
# [6,] -2.03609798 -0.497367640 
# [7,] 0.07445361 -0.860184103 
# [8,] -0.91453141 -0.060824754 
# [9,] 0.15602420 1.410276163 
# [10,] 0.02934662 0.003944793 

apply(x, 2, FUN = function(x) sort(x, decreasing = T)[1:floor(length(x)/2)]) 
#   [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] 
# [1,] 1.99469634 1.26424109 0.41719084 0.8869350 1.03190009 1.9882438 1.740170 2.1879180 0.96832400 
# [2,] 0.71114251 0.67077922 0.24914817 0.8852306 0.95048417 1.6756248 1.562347 1.2174872 0.95488318 
# [3,] 0.18540528 0.49382018 0.02752681 0.5643018 0.89797526 1.0081416 1.461293 1.1339939 0.18510415 
# [4,] 0.10877555 0.09147291 -0.32646679 0.5066870 0.66430042 0.9697466 1.306277 0.8384429 0.15602420 
# [5,] 0.01513086 0.03960243 -0.34041599 0.4836041 0.06116275 -0.2725779 1.242154 0.7314502 0.07445361 
#   [,10] 
# [1,] 1.410276163 
# [2,] 1.341705472 
# [3,] 1.136878023 
# [4,] 0.926037646 
# [5,] 0.004507257 

Редактировать Чтобы вернуть только половину из не-NA значений:

apply(x, 2, FUN = function(x) sort(x, decreasing = T)[1:floor(sum(!is.na(x))/2)]) 

Это возвращает список, где каждый элемент представляет собой вектор половины длины (округление вниз) чисел без пропущенных значений в каждой исходной колонке. Если случается, что эта длина одинакова для каждого столбца, она будет принуждаться к матрице, если только эта длина не равна 1, и в этом случае она будет вектором.

+1

Я пытался подумать о том, как избежать «применять» и перебирать строки, но я не мог победить его для скорости - заменить (x, TRUE, x [order (col (x), -x)]) [1: floor (nrow (x)/2),] 'было лучшим, что я мог сделать. – thelatemail

+0

Этот 'порядок (col (x), -x)' очень умный! Я удивлен, что это не быстрее. Хотя похоже, что 'order' делает свою долю' apply' под капотом, так что, возможно, это действительно не так. – Gregor

+0

Поскольку мои НС чередуются в каждом столбце, число положительных значений в каждом столбце различно. Ваше предложение сокращает половину всех данных и оставляет NA в столбце, где число положительных элементов меньше. Мое желание состоит в том, чтобы иметь только половину положительных чисел каждого столбца без NA. Я думаю, что ваше предложение находится на правильном пути, но, тем не менее, вместо этого работает над каждым столбцом, оно хорошо работает только на всех данных. – beboo23

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