У меня есть матрица присутствия/отсутствия встречаемости видов, которая выглядит следующим образом:
coords.x coords.y 1 2 3
Point 1 -69.07354 -15.76097 0 NA NA
Point 2 -69.91902 -15.86905 1 1 NA
Point 3 -69.90793 -15.79660 0 0 1
Point 4 -69.86849 -15.86500 0 0 NA
Point 5 -69.84020 -15.81637 1 0 NA
Я хочу извлечь координаты точек присутствия для определения пороговых значений моделей распределения видов. Взяв приведенный выше фрагмент, это будет выглядеть так:
coords.x coords.y 1 2 3
Point 2 -69.91902 -15.86905 1 1 NA
Point 3 -69.90793 -15.79660 0 0 1
Point 5 -69.84020 -15.81637 1 0 NA
До сих пор я пробовал следующий код:
Изначально я попробовал
SpeciesPoints <- filter(Species_Data,"1" = 0, "2" = 0,"3" = 0)
И я получил следующее сообщение об ошибке:
Error in UseMethod("filter") :
no applicable method for 'filter' applied to an object of class "c('matrix', 'array', 'double', 'numeric')"
После преобразования в фрейм данных я попробовал:
filter(Species_Data,"1" == 1 , "2" == 1,"3" == 1)
Но это создало пустой фрейм данных:
[1] coords.x coords.y 1 2 3
<0 rows> (or 0-length row.names)
Затем я попытался проверить, будет ли работать оператор OR, следующим образом:
filter(Species_Data,"1" == 1 | "2" == 1|"3" == 1)
Но это не удалило ни одной строки. Как мне отфильтровать так, чтобы, пока существует один экземпляр значения 1 в столбцах 1, 2 и 3, достаточных для сохранения строки, строки без значения 1 в этих столбцах удалялись?
Вы можете использовать
library(dplyr)
filter(df, if_any(!contains("coords"), ~ .x == 1))
# coords.x coords.y 1 2 3
#Point 2 -69.91902 -15.86905 1 1 NA
#Point 3 -69.90793 -15.79660 0 0 1
#Point 5 -69.84020 -15.81637 1 0 NA
Данные:
> dput(df)
structure(list(coords.x = c(-69.07354, -69.91902, -69.90793,
-69.86849, -69.8402), coords.y = c(-15.76097, -15.86905, -15.7966,
-15.865, -15.81637), `1` = c(0, 1, 0, 0, 1), `2` = c(NA, 1, 0,
0, 0), `3` = c(NA, NA, 1, NA, NA)), class = "data.frame", row.names = c("Point 1",
"Point 2", "Point 3", "Point 4", "Point 5"))
Используя R {base}, нет необходимости конвертировать в фрейм данных.
Данные.
dd<-
structure(list(coords.x = c(-69.07354, -69.91902, -69.90793,
-69.86849, -69.8402), coords.y = c(-15.76097, -15.86905, -15.7966,
-15.865, -15.81637), `1` = c(0, 1, 0, 0, 1), `2` = c(NA, 1, 0,
0, 0), `3` = c(NA, NA, 1, NA, NA)), class = "data.frame", row.names = c("Point 1",
"Point 2", "Point 3", "Point 4", "Point 5"))
Выберите последние три столбца по своему усмотрению.
l3 <- dd[, -(1:2)] # Remove the first 2 columns.
l3 <- dd[, c("1", "2", "3")] # Select by column name.
l3 <- dd[, tail(names(dd), 3)] # By the last three names.
l3 <- dd[, (ncol(dd)-2):ncol(dd)] # Select the last three columns
l3 <- dd[, 2 + seq(3)] # Three columns after the headers.
l3 <- cbind(dd$"1",dd$"2",dd$"3") # As a matrix.
Сохраняет строки, содержащие хотя бы одну 1.
# Index, TRUE if row contains at least one 1.
idx <- rowSums(l3, na.rm=TRUE) > 0
SpeciesPoints <- dd[idx, ]
SpeciesPoints
Предполагая, что ваша исходная матрица
mm <-
structure(c(-69.07354, -69.91902, -69.90793, -69.86849, -69.8402,
-15.76097, -15.86905, -15.7966, -15.865, -15.81637, 0, 1, 0,
0, 1, NA, 1, 0, 0, 0, NA, NA, 1, NA, NA), dim = c(5L, 5L), dimnames = list(
c("Point 1", "Point 2", "Point 3", "Point 4", "Point 5"),
c("coords.x", "coords.y", "1", "2", "3")))
# You can avoid conversion to a data frame.
SpeciesPoints <- mm[rowSums(mm[, 3:5], na.rm=TRUE) > 0, ]