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')
===============================================================
自己的方法是
-------------------------------------------------
> 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
===============================
按照某特定顺序排列某矩阵
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>
================================
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
==========================
> 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。