说我有两个向量:
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"
答案 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
非常有趣。巴普蒂斯特的方法很快就闪电了!