我已经以矩阵形式读取了一个csv文件(有m行和n列)。我想通过以口头形式进行过滤来过滤矩阵:
从列x中选择所有值,此行中另一列的值等于“blabla”。
这就像数据库中的select语句,我说我对矩阵的一个子集感兴趣,需要满足这些约束。
我怎么能在r?我将数据作为数据帧,并可以通过标题访问它。 data["column_values" = "15"]
不会返回名为column_values的列仅具有值15的行。
谢谢
答案 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)
首先请注意,matrix
和data.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
)返回的内容,以更好地了解索引的工作原理。