2016-04-26 2 views
6

У меня есть следующие dataframe (s):как строки и столбца частичного значения NA

s<-read.table(text = "V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 
    1 0 62 64 44 NA 55 81 66 57 53 
    2 0 0 65 50 NA 56 79 69 52 55 
    3 0 0 0 57 NA 62 84 76 65 59 
    4 0 0 0 0 NA 30 70 61 41 36 
    5 0 0 0 0 NA NA NA NA NA NA 
    6 0 0 0 0 0 0 66 63 51 44 
    7 0 0 0 0 0 0 0 80 72 72 
    8 0 0 0 0 0 0 0 0 68 64 
    9 0 0 0 0 0 0 0 0 0 47 
    10 0 0 0 0 0 0 0 0 0 0 ", header = TRUE) 

Как можно видеть строку и столбец 5 5 в данном случае включает в себя только NA и 0 значения. Я хотел бы опустить их и сохранить порядок строк и столбцов. Там может быть больше столбцов и строк в одном шаблоне, и я хотел бы сделать то же самое. Размер блока данных может быть изменен. Окончательный результат будет:

V1 V2 V3 V4 V6 V7 V8 V9 V10 
1 0 62 64 44 55 81 66 57 53 
2 0 0 65 50 56 79 69 52 55 
3 0 0 0 57 62 84 76 65 59 
4 0 0 0 0 30 70 61 41 36 
6 0 0 0 0 0 66 63 51 44 
7 0 0 0 0 0 0 80 72 72 
8 0 0 0 0 0 0 0 68 64 
9 0 0 0 0 0 0 0 0 47 
10 0 0 0 0 0 0 0 0 0 

Есть ли способ, чтобы получить пропущенную строку и номер столбца (в данном случае 5), а также?

+1

, так что же такое минимальное значение NA, которое оправдывало бы сброс строки/столбца. Должны ли все значения, отличные от NA, отклоняться до 0? –

+0

Как видно, это верхняя треугольная матрица. В каждом случае NA будет для строк: от столбца номера строки до последнего столбца (конец). И для того же номера столбца: от первой строки до того же номера строки (5 в этом примере) – Avi

+0

Это, вероятно, очевидно, но: вы должны использовать матрицу, а не файл data.frame. – Frank

ответ

3

Мы можем попробовать

v1 <- colSums(is.na(s)) 
v2 <- colSums(s==0, na.rm=TRUE) 
j1 <- !(v1>0 & (v1+v2)==nrow(s) & v2 >0) 

v3 <- rowSums(is.na(s)) 
v4 <- rowSums(s==0, na.rm=TRUE) 
i1 <- !(v3>0 & (v3+v4)==ncol(s) & v3 >0) 
s[i1, j1] 
# V1 V2 V3 V4 V6 V7 V8 V9 V10 
#1 0 62 64 44 55 81 66 57 53 
#2 0 0 65 50 56 79 69 52 55 
#3 0 0 0 57 62 84 76 65 59 
#4 0 0 0 0 30 70 61 41 36 
#6 0 0 0 0 0 66 63 51 44 
#7 0 0 0 0 0 0 80 72 72 
#8 0 0 0 0 0 0 0 68 64 
#9 0 0 0 0 0 0 0 0 47 
#10 0 0 0 0 0 0 0 0 0 

Предположим, что если мы изменим одно из значений 'с'

s$V7[3] <- NA 

Выполнив выше код, выход будет

# V1 V2 V3 V4 V6 V7 V8 V9 V10 
#1 0 62 64 44 55 81 66 57 53 
#2 0 0 65 50 56 79 69 52 55 
#3 0 0 0 57 62 NA 76 65 59 
#4 0 0 0 0 30 70 61 41 36 
#6 0 0 0 0 0 66 63 51 44 
#7 0 0 0 0 0 0 80 72 72 
#8 0 0 0 0 0 0 0 68 64 
#9 0 0 0 0 0 0 0 0 47 
#10 0 0 0 0 0 0 0 0 0 

ПРИМЕЧАНИЕ. Условие OP: содержит только значения NA и 0. Я хотел бы, чтобы опустить их

1

Вы можете попробовать следующее:

myRowSums <- rowSums(is.na(s) | s == 0) 
myColSums <- colSums(is.na(s) | s == 0) 

sSmall <- s[which(myRowSums != ncol(s)), which(myColSums != nrow(s))] 

Он работает следующим набором данных, чтобы понизиться все столбцы и строки, которые полностью сделаны из 0s и САМ.

s <- data.frame(a=c(0, rnorm(5), 0), b=c(0, rnorm(2), NA, NA,1, NA), c=c(rep(c(0,NA), 3), 0)) 
+1

try 'sSmall <- s [myRowSums! = Ncol (s), myColSums! = Nrow (s)]' –

+0

Спасибо @SerbanTanasa. пришлось работать через пару опечаток. – lmo

4

Необходимо определить, когда именно вы хотите отказаться. В данном случае это выглядит как матрица с одной стороны и диагонали всегда быть 0.

Однако, в общем, это то, что я использую

s[!rowSums(is.na(s))>1,!colSums(is.na(s))>1] 

Учитывая 0-х

s[!rowSums(is.na(s)|s==0)>9,!colSums(is.na(s)|s==0)>9] 
3

Я собирался предлагайте:

sclean <- s[rowSums(s == 0|is.na(s)) != ncol(s) | (rowSums(s == 0, na.rm=TRUE) == ncol(s)), 
     colSums(s == 0|is.na(s))!= nrow(s) | colSums(s == 0, na.rm=TRUE) == nrow(s)] 
+0

Я не думаю, что это правильно, так как ответ основан на значениях NA больше 1. Он может иметь более одного NA с не-NA (кроме 0s). Например, если мы делаем $ V7 [3] <- NA', тогда он опускает этот столбец, пока мое решение сохраняет его. – akrun

+1

@Avi Добавлено условие, чтобы сохранить 0 столбцов. –

+0

@akrun, мое решение, похоже, поддерживает v7 в вашем тестовом примере. –

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