Удаление столбцов и строк с именами ‘NA’ из таблицы данных R

#r

#r

Вопрос:

У меня есть таблица данных вариантов, в которой указана частота вариантов длины в отношении связанных SNP:

           A    C    G    T <NA>
  -1      0   64    0   63    2
  -2      0    0    0    1    0
  0       2 5995    2 5704  203
  1       0   13    0   16    1
  <NA>    0   27    0   21    0
  

Как вы можете видеть, есть и строка, и столбец. Я хочу удалить их, но, похоже, затрудняюсь указать их с помощью скрипта. Я пробовал следующее, но это возвращает только исходную таблицу, показанную выше:

     if(any(is.na(colnames(Data)))){
 -which(is.na(colnames(Data)))
}

if(any(is.na(rownames(Data)))){
  -which(is.na(rownames(Data)))
}

Data
  

Пожалуйста, кто-нибудь может сказать мне, где происходит сбой моего скрипта, или как я могу удалить строку и столбец?
Спасибо

Ответ №1:

Если ваши имена являются буквенной строкой "<NA>" , то ответ РонакШаха является первым и правильным.

Если нет, то попробуйте это:

 dat2[!is.na(rownames(dat2)), !is.na(colnames(dat2))]
#    y
# x   1 2 3 4
#   1 6 5 3 3
#   2 6 4 6 5
#   3 6 1 0 3
#   4 7 3 3 5
  

Данные:

 set.seed(42)
dat <- data.frame(
  x = sample(c(1:4, NA), size = 100, replace = TRUE),
  y = sample(c(1:4, NA), size = 100, replace = TRUE))
dat2 <- table(dat, useNA = "always")
dat2
#       y
# x      1 2 3 4 <NA>
#   1    6 5 3 3    3
#   2    6 4 6 5    4
#   3    6 1 0 3    1
#   4    7 3 3 5    2
#   <NA> 4 7 4 4    5
  

Комментарии:

1. То есть вы имеете в виду, что данные OP являются table , а не фреймом данных?

2. Это предположение, тбх. Хотя вопрос начинается с «У меня есть таблица» , и поскольку в нем упоминается «частота» , я подумал, что это справедливое предположение.

3. Это сработало отлично. Большое вам спасибо: два дня, когда я бился головой о стену, наконец-то подошли к концу

Ответ №2:

имена столбцов и строк хранятся в виде строк, поэтому вы не можете идентифицировать их с помощью is.na :

 df[rownames(df) != '<NA>', colnames(df) != '<NA>']

#   A    C G    T
#-1 0   64 0   63
#-2 0    0 0    1
#0  2 5995 2 5704
#1  0   13 0   16
  

данные

 df <- structure(list(A = c(0L, 0L, 2L, 0L, 0L), C = c(64L, 0L, 5995L, 
13L, 27L), G = c(0L, 0L, 2L, 0L, 0L), T = c(63L, 1L, 5704L, 16L, 
21L), `<NA>` = c(2L, 0L, 203L, 1L, 0L)), class = "data.frame", 
row.names = c("-1", "-2", "0", "1", "<NA>"))