Подставить матрицу (int, numeric) условием для нескольких значений столбца - PullRequest
0 голосов
/ 28 июня 2018

У меня есть большая матрица, которую мне нужно установить на основе значений столбцов (широта и долгота). Вот пример кода того, что я пробовал:

> a<-1:100
> a<-matrix(a,c(20,5))
> colnames(a)<-c("col1","col2","col3","col4","col5")
> b<-subset(a, "col2">28, select = c("col1","col2","col3","col4","col5"))
> all(a==b)
[1] TRUE

т.е. это не сработало. И я тоже попробовал:

> library(dplyr)
> b<-select(filter(a, "col2">28), c("col1","col2","col3","col4","col5"))
Error in UseMethod("filter_") : 
  no applicable method for 'filter_' applied to an object of class "c('matrix', 'integer', 'numeric')"

Пожалуйста, помогите. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Если я вас правильно понял, вы хотите поднастроить матрицу a на основе значений в col2. Вы можете подумать об использовании комбинации [] для этого.

a[a[, "col2"] > 28, ] # values in col2 greater than 28
# output
      col1 col2 col3 col4 col5
 [1,]    9   29   49   69   89
 [2,]   10   30   50   70   90
 [3,]   11   31   51   71   91
 [4,]   12   32   52   72   92
 [5,]   13   33   53   73   93
 [6,]   14   34   54   74   94
 [7,]   15   35   55   75   95
 [8,]   16   36   56   76   96
 [9,]   17   37   57   77   97
[10,]   18   38   58   78   98
[11,]   19   39   59   79   99
[12,]   20   40   60   80  100

a[a[, "col2"] > 28 & a[, "col2"] <= 38, ] # values in col2 greater than 28 and less or equal to 38 (i.e. between 28 and 38)
# output
      col1 col2 col3 col4 col5
 [1,]    9   29   49   69   89
 [2,]   10   30   50   70   90
 [3,]   11   31   51   71   91
 [4,]   12   32   52   72   92
 [5,]   13   33   53   73   93
 [6,]   14   34   54   74   94
 [7,]   15   35   55   75   95
 [8,]   16   36   56   76   96
 [9,]   17   37   57   77   97
[10,]   18   38   58   78   98

Обратите внимание, что функция filter() из dplyr требует в качестве аргумента объект tbl. Поэтому, если вы хотите использовать его, вам нужно предварительно установить матрицу a в виде таблицы или фрейма данных. библиотека (dplyr) * +1010 *

filter(as_tibble(a), col2 > 28)
filter(as.data.frame(a), col2 > 28)
0 голосов
/ 28 июня 2018

Как я вижу, вы хотите разместить столбцы на основе col2. Вы должны указать матрицу также во втором аргументе subset с a[,colname].

a <- 1:100
a <-matrix(a, c(20,5))
colnames(a) <- c("col1","col2","col3","col4","col5")
b <- subset(a, a[,"col2"] > 28, select = c("col1","col2","col3","col4","col5"))

Если вы хотите отфильтровать более одного столбца, вы можете использовать & или | (и и или). Например:

a <- 1:100
a <-matrix(a, c(20,5))
colnames(a) <- c("col1","col2","col3","col4","col5")
b <- subset(a, a[,"col2"] > 28 & a[,"col3"] < 58, select = c("col1","col2","col3","col4","col5"))

Вот пример с условием между, это также можно объединить с & и |.

b <- subset(a, dplyr::between(a[,"col2"], 28, 30), select = c("col1","col2","col3","col4","col5"))
...