先模拟一组数据来使用,如下:
> X<-data.frame("v1"=sample(0:10),"v2"=sample(10:20),"v3"=sample(20:30))
> X<-X[sample(0:10),]
> X$v2[c(1,3)]=NA
> X
v1 v2 v3
4 3 NA 30
8 8 10 20
7 6 NA 23
6 1 17 29
3 0 19 21
10 2 12 24
9 9 15 28
2 10 11 22
5 5 13 27
1 7 14 26
R语言在数据列表中检索的方法十分简单,用逻辑符号边可以写出自己需要的检索:下面几个例子来具体看一下:
“或”
> X[("v1">5|"v3"<25),]
v1 v2 v3
4 3 NA 30
8 8 10 20
7 6 NA 23
6 1 17 29
3 0 19 21
10 2 12 24
9 9 15 28
2 10 11 22
5 5 13 27
1 7 14 26
—————————————————————————————————————————————————
“和”
> X[(X$v1>=5 & X$v2<20),]
v1 v2 v3
8 8 10 20
NA NA NA NA
9 9 15 28
2 10 11 22
5 5 13 27
1 7 14 26
————————————————————————————————————————————————
当处理到v2的时候,数据开始改变了。原因是v2自身带有NA值。
> X[(X$v2>12),]
v1 v2 v3
NA NA NA NA
NA.1 NA NA NA
6 1 17 29
3 0 19 21
9 9 15 28
5 5 13 27
1 7 14 26
而这个情况,通常可以直接用which内置来索引!
> X[which(X$v2>12),]
v1 v2 v3
6 1 17 29
3 0 19 21
9 9 15 28
5 5 13 27
1 7 14 26
—————————————————————————————————————————————————
sort :提取某一列,并排序
> sort
function (x, decreasing = FALSE, ...)
> sort(X$v2,decreasing = F,na.last = T)
[1] 10 11 12 13 14 15 17 19 NA NA
—————————————————————————————————————————————————
order: 列表根据某一列来排序 ,用order function:
> order
function (..., na.last = TRUE, decreasing = FALSE, method = c("auto",
"shell", "radix"))
> X[order(X$v2),]
v1 v2 v3
8 8 10 20
2 10 11 22
10 2 12 24
5 5 13 27
1 7 14 26
9 9 15 28
6 1 17 29
3 0 19 21
4 3 NA 30
7 6 NA 23
再进一步的说,若按若干列来排列,应该怎么处理:
> X[order(X$v2,X$v1),] #先v2 再v1地进行排列
v1 v2 v3
8 8 10 20
2 10 11 22
10 2 12 24
5 5 13 27
1 7 14 26
9 9 15 28
6 1 17 29
3 0 19 21
4 3 NA 30
7 6 NA 23
—————————————————————————————————————————————————
可以用plyr包内的arrange():
> arrange
function (df, ...)
{
stopifnot(is.data.frame(df))
ord <- eval(substitute(order(...)), df, parent.frame())
if (length(ord) != nrow(df)) {
stop("Length of ordering vectors don't match data frame size",
call. = FALSE)
}
unrowname(df[ord, , drop = FALSE])
}
<environment: namespace:plyr>
> library(plyr)
> arrange(X,v1)
v1 v2 v3
1 0 19 21
2 1 17 29
3 2 12 24
4 3 NA 30
5 5 13 27
6 6 NA 23
7 7 14 26
8 8 10 20
9 9 15 28
10 10 11 22
> arrange(X,desc(v1))
v1 v2 v3
1 10 11 22
2 9 15 28
3 8 10 20
4 7 14 26
5 6 NA 23
6 5 13 27
7 3 NA 30
8 2 12 24
9 1 17 29
10 0 19 21
参考文献: