仅按照特定顺序排序首字母

6

我有一个类似于这样的字符向量:

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

我有一个名为“position”的向量,就像这样:

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

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

4个回答

8
你可以使用substring来提取stuff的第一个字母,使用match来将你的向量与参考向量匹配:
# 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
这个一行代码并不淫秽:stuff[order(match(substr(stuff,1,1),pos))] - thelatemail
我真的很喜欢那两个等效的解决方案。那个只有两行的代码对像我这样刚接触 R 的新手非常有启发性。等效的一行代码也很优美。 :) - Celso

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向量是唯一的。


0

你可以通过巧妙(如果我可以这么说)的操作,涉及到factors的转置来完成它:

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

编辑以添加一些解释和简化:

第一部分是仅隔离您的“stuff”向量的第一个字符。可以使用以下方法完成:

> 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"

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)

排序后数据框的“pos”列是您想要的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接