在r中按字母顺序粘贴两个向量的元素

时间:2014-08-31 02:19:31

标签: r apply paste mapply

说我有两个向量:

a<-c("george", "harry", "harry", "chris", "steve", "steve", "steve", "harry")
b<-c("harry", "steve", "chris", "harry", "harry", "george", "chris", "george")

我想要做的是将第一对,第二对等粘贴在一起.....然而,我想按字母顺序粘贴每对中的两个元素。在上面的例子中,前两对已按字母顺序排列,但第三对已经按字母顺序排列。和&#39;克里斯&#39;不是。我想回归&#34;克里斯哈里&#34;这对。

我已经找到了如何在两个步骤中完成这项工作,但是想知道是否有一种快速方法(一种方式)只使用paste来完成这项工作?

我的解决方案:

x <- apply(mapply(c, a, b, USE.NAMES = FALSE),2,sort)
paste(x[1,],x[2,])

按字母顺序给出对...但是有一条线路吗?

[1] "george harry" "harry steve"  "chris harry"  "chris harry"  "harry steve"  "george steve" "chris steve"  "george harry"

5 个答案:

答案 0 :(得分:3)

这是一种方法:

apply(cbind(a, b), 1, function(x) paste(sort(x), collapse=" "))

## [1] "george harry" "harry steve"  "chris harry"  "chris harry"  
## [5] "harry steve" "george steve" "chris steve"  "george harry"

使用您的初始尝试,您也可以执行以下操作,但它们都需要更多输入(不确定速度):

unlist(Map(function(x, y) paste(sort(c(x, y)), collapse=" "), a, b),,FALSE)
mapply(function(x, y) paste(sort(c(x, y)), collapse=" "), a, b, USE.NAMES = FALSE)

答案 1 :(得分:2)

稍微多余,因为它排序两次,但是矢量化,

paste(pmin(a,b), pmax(a,b))

修改:使用ifelse

替代
ifelse(a < b, paste(a, b), paste(b, a))

答案 2 :(得分:0)

这是与Tyler类似的方法,但Map。从技术上讲,这是一个单行...

unlist(Map(function(x,y) {
    paste(sort(c(x,y)), collapse = " ")
    }, a, b, USE.NAMES = FALSE))
# [1] "george harry" "harry steve"  "chris harry"  "chris harry" 
# [5] "harry steve"  "george steve" "chris steve"  "george harry"

答案 3 :(得分:0)

来自您自己代码的一个班轮:

apply(data.frame(apply(mapply(c, a, b, USE.NAMES = FALSE),1,paste)),1,function(x) paste(x[1],x[2]))
[1] "george harry" "harry steve"  "harry chris"  "chris harry"  "steve harry"  "steve george" "steve chris"  "harry george"


apply(apply(mapply(c, a, b, USE.NAMES = FALSE),2,sort),1,paste)

     [,1]     [,2]   
[1,] "george" "harry"
[2,] "harry"  "steve"
[3,] "chris"  "harry"
[4,] "chris"  "harry"
[5,] "harry"  "steve"
[6,] "george" "steve"
[7,] "chris"  "steve"
[8,] "george" "harry"

答案 4 :(得分:0)

以下是上述答案的速度比较......

我从我自己的数据集中获取了足球联赛前4个赛区所有英格兰足球比赛的数据,可在此处找到:https://github.com/jalapic/engsoccerdata

数据集是'engsoccerdata',我使用第3和第4列(主页和访客团队)粘贴在一起。我将每列转换为字符向量。每个向量有188,060个元素 - 从1888年至2014年,英国足球前四层有188,060个足球比赛。

以下是比较:

df<-engsoccerdata

a<-as.character(df[,3])
b<-as.character(df[,4])

#tyler1
system.time(apply(cbind(a, b), 1, function(x) paste(sort(x), collapse=" ")))

#tyler2
unlist(Map(function(x, y) paste(sort(c(x, y)), collapse=" "), a, b),,FALSE)

#tyler3
mapply(function(x, y) paste(sort(c(x, y)), collapse=" "), a, b, USE.NAMES = FALSE)

#baptiste1
paste(pmin(a,b), pmax(a,b))

#baptiste2
ifelse(a < b, paste(a, b), paste(b, a))  

#RichardS
unlist(Map(function(x,y) {
  paste(sort(c(x,y)), collapse = " ")
}, a, b, USE.NAMES = FALSE))


#rnso1
apply(data.frame(apply(mapply(c, a, b, USE.NAMES = FALSE),1,paste)),1,function(x) paste(x[1],x[2]))

#rnso2
apply(apply(mapply(c, a, b, USE.NAMES = FALSE),2,sort),1,paste) 

system.time()结果:

#              user  system elapsed 
#tyler1       42.92    0.02   43.73 
#tyler2       14.68    0.03   15.04
#tyler3       14.78    0.00   14.88 
#baptiste1     0.79    0.00    0.84 
#baptiste2     1.25    0.00    1.28 
#RichardS     15.40    0.01   15.64
#rnso1         6.22    0.10    6.41
#rnso2        13.07    0.00   13.15 

非常有趣。巴普蒂斯特的方法很快就闪电了!