Как предотвратить принуждение к перечислению в R - PullRequest
0 голосов
/ 22 мая 2018

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

data <- dget(file)

dependent <- data[,"chroma"]
independent <- data[,"mass..Pantheria."]

names(independent) <- names(dependent) <- rownames(data)

for (name in rownames(data)) {

    if(is.na(dependent[name])) {
      independent$name <- NULL
      dependent$name <- NULL
  }

    if(is.na(independent[name])) {
      independent$name <- NULL
      dependent$name <- NULL
  }
}
print(dput(independent))
print(dput(dependent))

Я новичок в R и пытаюсь выполнить эту задачу с помощью цикла for.Однако когда я удаляю раздел, назначая NULL, я получаю следующее предупреждение:

1: In independent$Aeretes_melanopterus <- NULL : Coercing LHS to a list
2: In dependent$name <- NULL : Coercing LHS to a list

Ни один элемент не удаляется, а independent и dependent сохраняют все свои исходные строки.

файл (вход):

structure(list(chroma = c(7.443501276, 10.96156313, 13.2987235, 
17.58110922, 13.4991105), mass..Pantheria. = c(NA, 126.57, NA, 
160.42, 250.57)), .Names = c("chroma", "mass..Pantheria."), class = "data.frame", row.names = c("Aeretes_melanopterus", 
"Ammospermophilus_harrisii", "Ammospermophilus_insularis", "Ammospermophilus_nelsoni", 
"Atlantoxerus_getulus"))
                              chroma mass..Pantheria.
Aeretes_melanopterus        7.443501               NA
Ammospermophilus_harrisii  10.961563           126.57
Ammospermophilus_insularis 13.298723               NA
Ammospermophilus_nelsoni   17.581109           160.42
Atlantoxerus_getulus       13.499111           250.57

желаемый вывод:

structure(list(chroma = c(10.96156313, 17.58110922, 13.4991105
), mass..Pantheria. = c(126.57, 160.42, 250.57)), .Names = c("chroma", 
"mass..Pantheria."), class = "data.frame", row.names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
                            chroma mass..Pantheria.
Ammospermophilus_harrisii 10.96156           126.57
Ammospermophilus_nelsoni  17.58111           160.42
Atlantoxerus_getulus      13.49911           250.57
structure(c(126.57, 160.42, 250.57), .Names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
Ammospermophilus_harrisii  Ammospermophilus_nelsoni      Atlantoxerus_getulus 
                   126.57                    160.42                    250.57 
structure(c(10.96156313, 17.58110922, 13.4991105), .Names = c("Ammospermophilus_harrisii", 
"Ammospermophilus_nelsoni", "Atlantoxerus_getulus"))
Ammospermophilus_harrisii  Ammospermophilus_nelsoni      Atlantoxerus_getulus 
                 10.96156                  17.58111                  13.49911 

1 Ответ

0 голосов
/ 22 мая 2018

Похоже, вы хотите опустить строки в ваших данных, где chroma или mass..Pantheria равны NA.Вот быстрый способ сделать это:

data = data[!is.na(data$chroma) & !is.na(data$mass..Pantheria.), ]

Я не уверен, почему вы разделяете independent и dependent по отдельности, но после фильтрации плохих наблюдений - этосамое время сделать это.

Поскольку это только два столбца, это эквивалентно пропуску строк в вашем фрейме данных, которые имеют любые значения NA, поэтому вы можете использовать ярлык, подобный этому:

data = na.omit(data)

Если вы хотите сохранить «нетронутую» копию ваших необработанных данных, просто измените имя результата:

data_no_na = na.omit(data)
# or
data = data[!is.na(data$chroma) & !is.na(data$mass..Pantheria.), ]

Что касается того, что не так с вашимкод $ используется для извлечения столбцов из фрейма данных, но вы пытаетесь использовать его для именованного вектора (так как вы уже извлекли столбцы), что не работает.Даже тогда $ работает только с литеральной строкой, вы не можете использовать ее с переменной.Для фреймов данных вам нужно использовать скобки для извлечения столбцов, хранящихся в переменных.Например, встроенные данные mtcars имеют столбец с именем "mpg":

# these work:
mtcars$mpg
mtcars[, "mpg"]

my_col = "mpg"
mtcars[, my_col]
mtcars$my_col ## does not work, need to use brackets!

. Никогда нельзя использовать $ с именами строк во фрейме данных, только с именами столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...