Фильтрация фрейма данных - PullRequest
       8

Фильтрация фрейма данных

10 голосов
/ 24 сентября 2011

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

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

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

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

Спасибо

Ответы [ 3 ]

15 голосов
/ 24 сентября 2011

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

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

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

> 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
8 голосов
/ 24 сентября 2011

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

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

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

4 голосов
/ 24 сентября 2011

Во-первых, обратите внимание, что matrix и 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), чтобы лучше понять, как работает индексация.

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