2015-06-30 4 views
0

Теперь мне нужно разбить эту матрицу на две матрицы на основе столбца со значениями «NA», со всеми «NA» и другими без «NA».Нанесение одной матрицы на две матрицы на основе «NA»

Вход:

>k 
     a u   v 
[1,] "10" "mature" "MIMAT0000062" 
[2,] "20" "stemloop" "NA" 
[3,] "40" "mature_2" "MIMAT0000043" 

Вывод должен быть, как

>k1 
     a u   v 
[1,] "10" "mature" "MIMAT0000062" 
[2,] "40" "mature_2" "MIMAT0000043" 

>k2 
     a u   v 
[1,] "20" "stemloop" "NA" 

Есть ли функция, чтобы сделать это?

+0

Настоящий NA без кавычек и использование символа '' NA "' не очень полезно для вас. Что делать, если один из NA находится в первой строке столбца «u»? Или это относится только к столбцу «v»? Для этого случая 'lapply (split (seq_len (nrow (k1)) is.na (k1 [, 3])), функция (i) k1 [i ,, drop = FALSE])' (если у вас есть реальные NA) – akrun

+0

«Есть ли какая-нибудь функция?» Да, есть: 'is.na()' – PoGibas

+2

@akrun Я думаю, что просто 'split (as.data.frame (k), is.na (k [, 3]))' должен делать, если OP в порядке с структура 'data.frame' в списке –

ответ

2

Вы можете разбить матрицу «к» следующим образом:

k1 <- k[which(rowSums(is.na(k))==0),] 
k2 <- k[which(rowSums(is.na(k))>0),] 

Хитрость заключается в том, что ИСТИНА и ЛОЖЬ, интерпретируются как 1 и 0, соответственно.

+0

Это работает хорошо. Но когда я хочу разделить на основе одного конкретного столбца, он терпит неудачу. Поскольку он проверяет любой NA (даже если какой-либо другой столбец NA, он разбивается). В этом случае 'k1 <- k [который (is.na (k [, 3]) == 0),] и k2 <- k [который (is.na (k [, 3])> 0),] 'работает хорошо. Основная идея такая же. – Kavipriya

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