Фильтрация кадра данных
Я прочитал файл 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
) возвращаются, чтобы лучше понять, как работает индексация.