Фильтрация кадра данных

Я прочитал файл csv в матричной форме (имея m строк и n столбцов). Я хочу фильтровать матрицу, проводя фильтр в устной форме:

Выберите все значения из столбца x, где значения другого столбца в этой строке равны "blabla".

Это похоже на оператор select в базе данных, где я говорю, что меня интересует подмножество матрицы, где эти ограничения должны быть выполнены.

Как я могу это сделать в r? У меня есть данные как dataframe и вы можете получить доступ к ним заголовками. data["column_values" = "15"] не возвращает мне строки, в которых столбец с именем column_values ​​имеет только значения 15.

Спасибо

Ответ 1

Вы сказали, что вам просто нужны значения столбца x, где column_values ​​было 15, правильно?

subset(dat, column_values==15, select=x)

Я думаю, что это может быть как фреймворк данных, поэтому вам может понадобиться unlist() и, возможно, даже "не использовать" его.

> dat
  Subject Product
1       1   ProdA
2       1   ProdB
3       1   ProdC
4       2   ProdB
5       2   ProdC
6       2   ProdD
7       3   ProdA
8       3   ProdB
> subset(dat, Subject==2, Product)
  Product
4   ProdB
5   ProdC
6   ProdD
> unlist( subset(dat, Subject==2, Product) )
Product1 Product2 Product3 
   ProdB    ProdC    ProdD 
Levels: ProdA ProdB ProdC ProdD
> as.character( unlist( subset(dat, Subject==2, Product) ) )
[1] "ProdB" "ProdC" "ProdD"

Если вы хотите, чтобы все столбцы вы могли отбросить третий аргумент (аргумент select =):

subset(dat, Subject==2 )

  Subject Product
4       2   ProdB
5       2   ProdC
6       2   ProdD

Ответ 2

Предполагая, что dat является рассматриваемым кадром данных, col - это имя столбца, а "value" - это значение, которое вы хотите, вы можете сделать

dat[dat$col=="value",]

Получает все строки dat, для которых dat$col=="value" и все столбцы.

Ответ 3

Во-первых, обратите внимание, что a matrix и a data.frame - это разные вещи в R. Я предполагаю, что у вас есть data.frame (как это то, что возвращается read.csv()). data.frame имеют именованные столбцы (если вы их не даете, для вас создаются общие).

Вы можете подмножить data.frame, указав обе строки, которые вы хотите, и/или какие столбцы вы хотите. Самый простой способ указать, какие строки имеют логический вектор, часто построенный из сравнений с использованием конкретных столбцов data.frame. Например, data[["column values"]] == "15" сделает логический вектор, который является TRUE, если соответствующая запись в столбце column values является строкой "15" (поскольку она находится в кавычках, это строка, а не число). Вы можете сделать как можно более сложные критерии выбора (объединяя логические векторы с & и |), чтобы указать нужные строки. Этот вектор становится первым аргументом в индексировании.

Список имен столбцов или номеров может быть вторым аргументом. Если любой аргумент отсутствует, предполагается, что все строки (или столбцы).

Объединив все это, вы получите примеры, например

data[data[["column values"]] == "15", ]

или используя фактический набор данных (mtcars)

mtcars[mtcars$am == 1, ]
mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg"]
mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg", drop=FALSE]
mtcars[mtcars$hp > 100, c("mpg", "carb")]

Посмотрите, что каждое из условных выражений (первые аргументы, например mtcars$am == 1 & mtcars$hp > 100) возвращаются, чтобы лучше понять, как работает индексация.