按特定顺序仅排序第一个字符

时间:2014-04-03 21:42:12

标签: r sorting

我有一个像这样的角色矢量:

stuff <- c("3S", "AH", "2I", "B4", "AL")

我有一个像这样的“位置”矢量:

pos <- c("3", "B", "A", "2")

我想使用最后一个向量作为参考,通过仅查看每个元素的第一个字符来对第一个向量进行排序;我不关心第二个角色。也就是说,我想写一个像specialsort(stuff, pos)这样的函数,我的结果应该是c("3S", "B4", "AH", "AL", "2I")

4 个答案:

答案 0 :(得分:7)

您可以使用substring提取stuffmatch的第一个字母,以使您的向量与引用相匹配:

# find index in pos
i <- match(substring(stuff, 1, 1), pos)

# order by pos
o <- order(i)

stuff[o]
# [1] "3S" "B4" "AH" "AL" "2I"

答案 1 :(得分:2)

我几乎可以肯定这是一种更简单的方法,但这样做有效:

specialsort <- function(stuff, pos) {
  stuff.pos <- sapply(pos,function(x) which(substring(stuff,1,1) == x))
  stuff[unlist(stuff.pos)]
}

specialsort(stuff,pos)

小心:这(以及许多其他解决方案)隐含地假设pos向量是唯一的。

答案 2 :(得分:0)

你可以通过一个聪明的(如果我可以说是我自己)操纵涉及到factors的转置:

stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))]

已修改以添加一些解释并简化:

第一部分是仅隔离你的东西矢量的第一个字符。这可以通过以下方式完成:

> sapply(stuff,function(x)unlist(strsplit(x,''))[1])
 3S  AH  2I  B4  AL 
"3" "A" "2" "B" "A" 

然后,您可以使用向量pos作为级别将其转换为因子:

> factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos)
3S AH 2I B4 AL 
 3  A  2  B  A 
Levels: 3 B A 2

最后,您可以从以下因素中获得正确的顺序:

> order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))
[1] 1 4 2 5 3

结尾只是从原始stuff向量中获取一个子集:

> stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))]
[1] "3S" "B4" "AH" "AL" "2I"

答案 3 :(得分:0)

stuff <- c("3S", "AH", "2I", "B4", "AL")
pos <- c("3", "B", "A", "2")

stuff.df = data.frame(stuff,pos = substr(stuff,1,1))
merge(data.frame(pos),stuff.df,sort = F)

已排序的data.frame的“pos”列是您想要的