我有一个像这样的角色矢量:
stuff <- c("3S", "AH", "2I", "B4", "AL")
我有一个像这样的“位置”矢量:
pos <- c("3", "B", "A", "2")
我想使用最后一个向量作为参考,通过仅查看每个元素的第一个字符来对第一个向量进行排序;我不关心第二个角色。也就是说,我想写一个像specialsort(stuff, pos)
这样的函数,我的结果应该是c("3S", "B4", "AH", "AL", "2I")
。
答案 0 :(得分:7)
您可以使用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 :(得分: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”列是您想要的