过滤数据框

时间:2011-09-23 20:29:21

标签: r select filter

我已经以矩阵形式读取了一个csv文件(有m行和n列)。我想通过以口头形式进行过滤来过滤矩阵:

从列x中选择所有值,此行中另一列的值等于“blabla”。

这就像数据库中的select语句,我说我对矩阵的一个子集感兴趣,需要满足这些约束。

我怎么能在r?我将数据作为数据帧,并可以通过标题访问它。 data["column_values" = "15"]不会返回名为column_values的列仅具有值15的行。

谢谢

3 个答案:

答案 0 :(得分:15)

你说你只想要列x值为15的列x,对吗?

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

答案 1 :(得分:8)

假设dat是相关数据框,col是列的名称,"value"是您想要的值,您可以这样做

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

获取dat的所有行dat$col=="value"以及所有列。

答案 2 :(得分:4)

首先请注意,matrixdata.frame在R中是不同的东西。我想你有一个data.frame(因为这是read.csv()返回的内容) 。 data.frame已命名列(如果您不给它们,则为您创建通用的列)。

您可以通过指示所需的行和/或所需的列来对data.frame进行子集化。指定哪些行具有逻辑向量的最简单方法,通常使用data.frame的特定列进行比较。例如data[["column values"]] == "15"如果列TRUE中的对应条目是字符串“15”,则会生成column values的逻辑向量(因为它在引号中,它是一个字符串,而不是一个号码)。您可以根据需要制作复杂的选择条件(将逻辑向量与&|组合在一起)以指定所需的行。该向量成为索引中的第一个参数。

列名或数字列表可以是第二个参数。如果缺少任一参数,则假定所有行(或列)。

将所有这些放在一起,你会得到像

这样的例子
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)返回的内容,以更好地了解索引的工作原理。