【R】R中的序列问题——待更新

R中处理一些序列

1 筛选列表中特定的行
==============================================================
a <- data.frame(t1 = c('A','B','C','D','E','F','G'),t2 = rep(2, 7), t3 = 1:7 )
a
  t1 t2 t3
1  A  2  1
2  B  2  2
3  C  2  3
4  D  2  4
5  E  2  5
6  F  2  6
7  G  2  7
b <- c('G','B','D')
===============================================================
自己的方法是
-------------------------------------------------
c <- !is.na(match(a$t1,b))
subset(a, c, t1:t3)
  t1 t2 t3
2  B  2  2
4  D  2  4
7  G  2  7
-------------------------------------------------
可是觉得太笨了,求助COS论坛。
解决办法:a[a$t1 %in% b, ],不错


2 找两个向量的交集
match() 或者 intersect()
所以还是使用match()较好
===============================
# The code of intercet
function (x, y)
{
    y <- as.vector(y)
    unique(y[match(as.vector(x), y, 0L)])
}
<environment: namespace:base>
================================

3 按照某行/列排列某矩阵

sort(x, decreasing = FALSE, ...):将一个序列进行升序/降序

order(..., na.last = TRUE, decreasing = FALSE)sort()排序之后的序列按照order(升序或者降序)在原始序列中的位置。简而言之一句话“排序后的序列在原序列的位置”,这个函数在“按照下标访问元素”有着很大的作用。rank():序列中每个元素的排名。简而言之,序列s1和它的从小到达排列的序列s2,order就是s2的元素在s1中的位置,rank就是s1元素在s2中的位置。所以,order返回的是排序后元素在原始序列中的位置,rank返回的原始序列的排名。

================================

> b
[1] 1 5 7 4 31 24
> b2
[1] 24 31 1 7 4 5
> sort(b)[rank(b2)]
[1] 24 31 1 7 4 5
================================

===============================

> a <- matrix(c(c(5,2,3,1,4), 1:5,5:1), 5 )
> a
     [,1] [,2] [,3]
[1,]    5    1    5
[2,]    2    2    4
[3,]    3    3    3
[4,]    1    4    2
[5,]    4    5    1
> a[order(a[,1]), ]
     [,1] [,2] [,3]
[1,]    1    4    2
[2,]    2    2    4
[3,]    3    3    3
[4,]    4    5    1
[5,]    5    1    5
===============================
按照某特定顺序排列某矩阵
===============================
> c1 <- cbind(b, 1:6)
> c1
      b 
[1,]  1 1
[2,]  5 2
[3,]  7 3
[4,]  4 4
[5,] 31 5
[6,] 24 6
> b2
[1] 24 31  1  7  4  5
> c2 <- c1[order(c1[,1]), ]
> c2
      b 
[1,]  1 1
[2,]  4 4
[3,]  5 2
[4,]  7 3
[5,] 24 6
[6,] 31 5
> c2[rank(b2), ]
      b 
[1,] 24 6
[2,] 31 5
[3,]  1 1
[4,]  7 3
[5,]  4 4
[6,]  5 2
==========================

4 按照某列筛选两个data.frame的相同部分
merge(x, y, by = intersect(names(x), names(y)),
           by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
           sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)
by.x表示x中的某列,by.y表示y中的某列,sort可以设置成FALSE。
 
5 删除相同的行或者列,使用duplicated函数。注意,MARGIN = 1(default)按照行排列,即返回结果的长度等于nrow;MARGIN = 2相反,是按照列排列
=========================
> a <- matrix(c(1:10, 10:1), 5)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    6   10    5
[2,]    2    7    9    4
[3,]    3    8    8    3
[4,]    4    9    7    2
[5,]    5   10    6    1
> a <- apply(a, 2, sort)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    6    6    1
[2,]    2    7    7    2
[3,]    3    8    8    3
[4,]    4    9    9    4
[5,]    5   10   10    5
> duplicated(a, MARGIN=2)
[1] FALSE FALSE  TRUE  TRUE
> a[, !duplicated(a, MARGIN=2)]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
=======================================
http://cos.name/cn/topic/16028提供了另外一种去除相同行或者列方法,即使用SQL。
 
转自:http://blog.sina.com.cn/s/blog_61f013b80100mwaj.html
posted on 2012-08-23 19:26  香格里拉\(^o^)/  阅读(453)  评论(0编辑  收藏  举报